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

hel*_*922 2 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;
}
Run Code Online (Sandbox Code Playgroud)

注意:我不是问如何预先防止这种类型的问题(例如,在尝试除以零之前检查a是否为零).

asv*_*kau 9

这不是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内核通过一些非便携机制将它传递给你.

  • 另外,如果使用`/ EHa`编译,它将被捕获为`catch(...)`.还有一个特定于Visual C++的`set_se_translator`函数,它弥合了OS结构化异常和C++语言异常之间的差距. (5认同)
  • 在UNIX世界中,除以零时会出现"SIGFPE"信号.见http://en.wikipedia.org/wiki/SIGFPE (3认同)