我正在尝试编写一个提示用户输入五位数的函数,我想编写一个异常块来处理错误的输入,以防用户尝试输入一个字符串或一些非整数输入。
我知道如何为分割函数编写一个异常处理块,其中你为分母为0抛出异常,但我不知道如何对我无法控制的输入执行此操作。
答案 0 :(得分:7)
首先,我通常会反对这一点 - 来自用户的错误输入几乎是规则而不是例外。
如果你仍坚持这样做,你可能会接受任何作为输入,然后在/如果它不是你想要的时候抛出异常:
// Warning: untested code.
// Accepting negative numbers left as an exercise for the reader.
int get_int(std::istream &is) {
std::string temp;
std::getline(temp, is);
for (int i=0; i<temp.size(); i++)
if (!isdigit(temp[i]))
throw std::domain_error("Bad input");
return atoi(temp);
}
然而,我再说一遍,我认为这通常不是一个好主意。我注意到(例如)iostream已经为此类情况定义了一个fail
位(而读取int的普通operator>>
使用了该机制)。
答案 1 :(得分:0)
最直接的解决方案是读取字符串,并将其转换为整数,例如使用atoi
。如果结果为零,并且字符串不是“0”,则表示输入不是数字,而不需要自己遍历字符串。
答案 2 :(得分:0)
当接受来自另一台机器或进程的数据时,例外通常是合适的,其中没有理由期望在其他有效数据流中发生无效数据。关于用户输入,例外应仅用于应与正常程序流明显不同的情况。例如,如果程序具有tty样式的接口,并且应该读取输入行的例程获得control-C,则这样的例程抛出异常可能是有用的。 control-C不一定会结束程序,但是如果程序期望从用户读取几行输入,则在一次输入control-C应该经常导致跳过余数。