【问题标题】:C++ advice on exception handling关于异常处理的 C++ 建议
【发布时间】:2019-03-07 07:46:45
【问题描述】:

由于我对异常非常陌生,因此我在使用以下内存异常代码时遇到了一些问题。基本上,我需要计算并显示 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; 
    }
}

【问题讨论】:

  • 流本身可以作为布尔值进行测试,以查看读取是否失败。例如:if (std::cin&gt;&gt;number) { test number for negative/NaN and throw exception if true } else { didn't get a number at all. Throw exception }
  • 嗨@user4581301,我如何测试NaN?感谢您的意见。
  • 如果您的编译器相当新(支持 C++11),您可以使用恰当命名的 isnan。如果没有,it gets ugly.

标签: c++ exception


【解决方案1】:

你说“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 不同)。为此,您需要包含 &lt;string&gt;。如果您不需要打印任何内容,您可以只使用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;
}

isnan 需要包含 &lt;math.h&gt;

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

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多