我正在尝试在一个简单的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中运行该程序并完成多次清理并重新构建,但没有正面结果。
请帮助我查看相关答案,但我无法确定问题。
答案 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++03
和C++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;