3

我是一个(有点)经验丰富的 python 程序员,试图迁移到 C++。我希望能够捕获无效的用户输入。例如,如果一个变量需要一个整数,而用户键入一个字符串,我想捕捉那个错误。在 python 3 中,语法是:

try:
    #block of code you want to run
except ValueError:
    #Block of code to be run if the user inputs an invalid input

在 c++ 中,我读到语法是 Try, catch。我正在尝试这样做,但它不起作用。这是我在 C++ 中的代码:

#include "Calculator.h"
#include <iostream>
#include <exception>

using namespace std;

Calculator::Calculator()
{
}

int Calculator::Calc()
{
    cout << "Enter a number " << endl;
try
{
    cin >> a;
}
catch (logic_error)
{
    cout << "An error has ocurred! You have entered an invalid input!"
}

如何在 C++ 中捕获无效输入?是的,我正在为这个类使用一个头文件。如果您需要这些内容,请告诉我。如果我找到答案,我将继续搜索网络并发布!

4

3 回答 3

5

您将需要#include <limits>

int x;
std::cout << "Enter a number: ";
std::cin >> x;
while(std::cin.fail()) {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    std::cout << "Bad entry.  Enter a NUMBER: ";
    std::cin >> x;
}
std::cout << "x = " << x << std::endl;

有一个模板给你。

于 2013-10-31T00:41:10.037 回答
4

默认情况下,C++ 流不会抛出格式错误的输入:输入错误并不例外。这是正常的。指示输入失败的 C++ 方法是将流置于失败状态,即设置状态标志std::ios_base::failbit。测试错误输入的最简单方法是使用类似

if (in >> value) {
    process(value);
}
else {
    deal_with_input_error(in);
}

处理输入错误通常相当于清除流的状态(只要它是故障模式,它根本不会处理实际的流),然后是ignore()一个或多个违规字符。

如果你真的想得到一个异常,你可以设置一个异常掩码:

in.exceptions(std::ios_base::failbit);
try {
    in >> value;
}
catch (std::ios_base::failure const& ex) {
    // deal with the error
}

每当in.exceptions() & in.rdstate()处理状态位或异常掩码的任何成员的末尾都为非零时,称为抛出异常(即调用in.exception(std::ios_base::failbit)本身可能抛出异常)。抛出的异常类型为std::ios_base::failure

我建议不要使用 IOStreams 中的异常设施!输入错误是正常的,异常是针对异常错误。在读取值后使用转换bool效果相当好。

于 2013-10-31T00:49:45.020 回答
1

默认情况下,流不会抛出异常(可以配置为这样做)。

读取 int 的常用代码是:

int a;
if (std::cin >> a) {
    # OK
} else {
    # error
}

但请确保您知道>>这里实际做了什么。具体来说,C++ 的新手有时会惊讶于它不一定会读一整行。所以,如果你想验证一整行输入,或者如果你想重试失败,那么你需要更多的代码。

于 2013-10-31T00:42:34.067 回答