我有以下代码:
//...
int variable_1, variable_2;
cout << "Please enter the 2 numbers: ";
try
{
if ( !(cin >> variable_1) ) throw Invalid_number(); //empty class just for exceptions
if ( !(cin >> variable_2) ) throw Invalid_number(); //problem is here.
}
catch (Invalid_number) {cerr << "You must enter integers\n"; return -1;}
//...
因此,如果我为variable_1输入一个整数,为variable_2输入一个双精度值,程序不会抛出异常,它只是继续执行程序的其余部分。从调试中我看到,当我输入双变量_2(即 2.4)时,它只是将其转换为 2 并且不会引发异常。相反,如果我为variable_1输入一个双精度值,它会抛出异常,它被捕获并且程序结束(返回-1)。有谁知道为什么会发生这种情况以及如何使其在每次输入的两个数字中的任何一个不是 int 时抛出异常?
当你读到一个int
使用一个std::istream
它首先跳过前导空格,然后尝试读取一个符号(如果没有,则假定为正),然后是一系列数字。一旦没有更多的数字,它就会停止读取。如果至少可以读取一位数字并且数字序列与符号相结合产生该值,则读取成功。否则读取失败。
在第一种情况下,第一个值被完全读取,然后读取留下小数点.
以及其后的所有未读内容。但是,读取均成功。
在第二种情况下,读取小数点之前的数字,将小数点留在流中。第二次读取尝试读取int
并且找不到小数点。
如果有其他情况,则使读取失败有点棘手,因为不清楚哪些输入应该失败!您可以在读取后检查下一个字符是否是预期字符,例如空格。 ...或者您可以读取该行的其余部分并验证它是否只包含空格:这将是在格式化和未格式化之间切换而不进行任何读取的罕见情况之一是正确的做法。
通过覆盖相应的do_get()
的成员std::num_get<...>
方面并安装std::locale
在找到预期失败案例之一时失败的对象int
可能会失败。不过,我怀疑这比这里合理的要复杂一些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)