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

2024-02-16

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

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

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


这不是一个 C++ 问题,因为在标准 C++ 中没有办法这样做。

在 Windows 中,这会生成一个结构化异常处理 http://msdn.microsoft.com/en-us/library/ms680657(v=vs.85).aspx例外。

See 这个例子 http://msdn.microsoft.com/en-us/library/ms681409(v=vs.85).aspx来自 MSDN:

__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++ 代码,最好在软件中检查是否被零除,而不是依赖硬件生成错误,并让操作系统内核通过某种不可移植的机制将其传递给您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除以零时会抛出什么类型的异常? 的相关文章

随机推荐