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

How do I write exception handling for bad input?

本文关键字:异常处理 输入 错误      更新时间:2023-10-16

我想写一个函数,提示用户输入一个五位数的数字,我想写一个异常块来处理错误的输入,如果用户试图输入一个字符串或一些非整数输入。

我知道如何为除法函数之类的东西编写异常处理块,其中您在分母为0时抛出异常,但我不知道如何为我无法控制的输入执行此操作。

首先,我通常不建议这样做——来自用户的错误输入几乎是规则,而不是例外。

如果你坚持这样做,你可能会接受任何作为输入,然后在/如果不是你想要的时候抛出一个异常:

// 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);
}

我要再说一遍,我认为这通常不是个好主意。我要注意(举个例子),iostreams已经专门为这种情况定义了一个fail位(普通的operator>>读取int使用该机制)。

最直接的解决方案是读取字符串,并将其转换为整数,例如atoi。如果结果为0,并且字符串不是"0",则知道输入不是数值,而无需自己遍历字符串。

当接受来自另一台机器或进程的数据时,没有理由期望在其他有效的数据流中出现无效数据时,异常通常是合适的。对于用户输入,应该只在与正常程序流明显不同的情况下使用异常。例如,如果一个程序有一个ty风格的接口,并且一个应该读取一行输入的例程得到了control-C,那么对于这样的例程抛出异常可能是有用的。control-C不一定要结束程序,但是如果程序期望从用户那里读取几行输入,那么在其中一行输入control-C通常会导致跳过其余部分。