除以零时会抛出什么类型的异常?

时间:2011-01-29 03:48:54

标签: c++ visual-c++

当出现零除错误时会抛出什么样的异常?我尝试使用“catch-all”catch(...),但Visual Studio仍然抱怨存在未处理的异常。

int a = 0;
try
{
    a /= a;
}
catch (/* what should I catch?*/)
{
    cout << "divide by zero error" << endl;
}

注意:我之前并没有询问如何防止此类问题(例如,在尝试除以零之前检查a是否为零)。

1 个答案:

答案 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内核通过一些非便携式机制将它传递给你