如何为错误输入编写异常处理
How do I write exception handling for bad input?
我想写一个函数,提示用户输入一个五位数的数字,我想写一个异常块来处理错误的输入,如果用户试图输入一个字符串或一些非整数输入。
我知道如何为除法函数之类的东西编写异常处理块,其中您在分母为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通常会导致跳过其余部分。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 处理输入流运算符>>中的无效输入
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- 如何为错误输入编写异常处理