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