当出现零除错误时会抛出什么样的异常?我尝试使用"catch-all" catch(...),但Visual Studio仍然抱怨有一个未处理的异常.
int a = 0;
try
{
a /= a;
}
catch (/* what should I catch?*/)
{
cout << "divide by zero error" << endl;
}
Run Code Online (Sandbox Code Playgroud)
注意:我不是问如何预先防止这种类型的问题(例如,在尝试除以零之前检查a是否为零).
这不是C++问题,因为在标准C++中没有办法这样做.
在Windows中,这会生成结构化异常处理异常.
从MSDN 查看此示例:
__try
{
*pResult = dividend / divisor;
}
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
但这是不可移植的,特定于Windows.最后我知道GCC也不支持它,即使在Windows上也是如此.
如果你问一个更广泛的问题,它的工作方式是当你进行除以零时你的CPU会产生一个中断.Windows内核处理此问题并将其提供给您的流程,使您有机会处理它.如果你不处理它,你的过程就会消失.在Unix类型的操作系统上,它会保持不变,但它可能会产生一个信号.我不确定是哪一个.
我想说如果你想编写可移植的C++代码,最好在软件中检查除以零,而不是依靠硬件来生成错误,并且OS内核通过一些非便携机制将它传递给你.