有关异常处理的C ++建议

时间:2019-03-07 07:46:45

标签: c++ exception

由于我对异常非常陌生,因此在下面的内存异常代码方面遇到了一些麻烦。基本上,我需要计算并显示10个正输入的总和。在输入期间,我的程序应使用异常机制来显示一条消息,提示输入负数/非数字(NaN)(如果允许),然后退出程序。我被告知使用 std :: cin.fail()来检测输入的值是否适合变量类型(但是我不确定如何实现)。非常感谢您的帮助!

#include <iostream>

int main() {
    int number;
    int a=-2;
try {

    for(int i=0; i<10;i++) {
    std::cin>>number;

    }
}
catch (...) {

    number==-number?
      std::cout << "Its negative"<<std::endl; 

    number==a? 
      std::cout << "Its NaN"<<std::endl; 
    }
}

1 个答案:

答案 0 :(得分:0)

您说“ 10个积极的投入”,但您有int number;。如果您的number将是一个整数,那么它就不能像33.44这样的分数,也不能是NaN(因此您不需要检查)。如果要允许分数,请改为使用double number。除此之外,支票可能看起来像这样:

for (int i = 0; i < 10; i++) {
        std::cin >> number;
        if (std::cin.fail()) {
            std::cin.clear();
            std::string input;
            std::cin >> input;
            std::cout << "input failed! Invalid input: " << input << std::endl;
            return -1;
        }

在输入每个数字后,请进行std::cin.fail()检查。如果失败,您可以返回。在此示例中,我还使它打印了无效的输入。为此,您需要调用std::cin.clear();来重置该错误标志,然后可以将该无效输入放入std::string中(应该工作,与number不同)。您需要为此添加<string>。如果您不需要打印任何内容,则只需return并忽略清除,字符串和输出。另外,在此示例中,由于无效输入造成的混乱被彻底清除,因此如果您不return,则可以再次使用更多(有效)输入。

下一步,检查负数:

if (number < 0) {
    std::cout << "Error: Negative number!" << std::endl;
    return -1;
}

最后,NaN检查(对于double):

if (isnan(number)) {
    std::cout << "Error: number is NaN!" << std::endl;
    return -1;
}

<math.h>中需要包含isnan

将它们放在一起,看起来可能像这样:

#include <iostream>
#include <string> // std::istream >> std::string
#include <math.h> // isnan

int main() {
    double number;

    for (int i = 0; i < 10; i++) {
        std::cin >> number;
        if (std::cin.fail()) {
            std::cin.clear();
            std::string input;
            std::cin >> input;
            std::cout << "input failed! Invalid input: " << input << std::endl;
            return -1;
        }
        if (number < 0) {
            std::cout << "Error: Negative number!" << std::endl;
            return -1;
        }
        if (isnan(number)) {
            std::cout << "Error: number is NaN!" << std::endl;
            return -1;
        }
    }
    return 0;
}