【问题标题】:What type of exception is thrown when dividing by zero?除以零时抛出什么类型的异常?
【发布时间】:2011-01-29 03:48:53
【问题描述】:

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

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

注意:我不是在询问如何事先预防此类问题(例如,在尝试除以零之前检查 a 是否为零)。

【问题讨论】:

标签: c++ visual-c++


【解决方案1】:

这不是 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++ 代码,最好在软件中检查除以零,而不是依靠硬件来生成故障并让操作系统内核通过一些不可移植的机制将其传递给您.

【讨论】:

  • 另外,如果用/EHa编译,会被catch (...)捕获。还有一个 Visual C++ 特定的 set_se_translator 函数,它弥合了 OS 结构化异常和 C++ 语言异常之间的差距。
  • 在 UNIX 世界中,除以零时会产生一个 SIGFPE 信号。见en.wikipedia.org/wiki/SIGFPE
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 2011-05-06
  • 1970-01-01
  • 2018-10-12
  • 2011-08-31
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多