try()和catch()不起作用;程序崩溃,永远不会执行catch()块

时间:2014-11-27 03:54:27

标签: c++ try-catch crash-reports

我正在尝试在一个简单的C ++代码上使用异常捕获机制,该代码有效地除以0:

#include <iostream>
using namespace std;
const int DefaultSize = 10;

int main()
{
int top = 90;
int bottom = 0;
cout << "top / 2 = " << (top/ 2) << endl;
cout << "top / 3 = " << (top/ 3) << endl;

try
{
cout << "top divided by bottom = ";
cout << (top / bottom) << endl;
}
catch(...)
{
cout << "something has gone wrong!" << endl;
}
cout << "Done." << endl;
return 0;
}

程序崩溃并且没有执行catch块 - 在Eclipse中我收到一个标准错误:
0 [main] CPP166 8964 cygwin_exception :: open_stackdumpfile:将堆栈跟踪转储到CPP166.exe.stackdump 。 在另一个IDE NetBeans中运行该程序并完成多次清理并重新构建,但没有正面结果。 请帮助我查看相关答案,但我无法确定问题。

1 个答案:

答案 0 :(得分:2)

除以零是在C ++中引发异常的事件之一。

ISO标准中列出的例外情况是:

namespace std {
    class logic_error;
        class domain_error;
        class invalid_argument;
        class length_error;
        class out_of_range;
    class runtime_error;
        class range_error;
        class overflow_error;
        class underflow_error;
}

你会认为overflow_error非常适合用零来表示。

C++03C++11部分5.6 /4具体说明:

  

如果/%的第二个操作数为零,则行为未定义。

如果您想要例外,则必须自行编码,例如:

#include <stdexcept>

inline int intDiv (int num, int denom) {
    if (denom == 0) throw std::overflow_error("DivByZero");
    return num / denom;
}

并转换您的来电:

cout << (top / bottom) << endl;

为:

cout << intDiv(top, bottom) << endl;