如何为错误输入编写异常处理?

时间:2011-10-30 18:33:30

标签: c++ exception-handling error-handling

我正在尝试编写一个提示用户输入五位数的函数,我想编写一个异常块来处理错误的输入,以防用户尝试输入一个字符串或一些非整数输入。

我知道如何为分割函数编写一个异常处理块,其中你为分母为0抛出异常,但我不知道如何对我无法控制的输入执行此操作。

3 个答案:

答案 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应该经常导致跳过余数。