4

不调用以下 catch():

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

有没有办法捕捉这种异常?

4

3 回答 3

9

请检查 http://linux.die.net/man/1/gcc 有一个编译器选项 -mcheck-zero-division 来处理这个问题。

或者,安装 SIGFPE 处理程序可能是一个选项,浮点 div by 0 然后会生成一个“FPE_ZERODIVIDE”

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

         void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
          {
                switch(nErrType)
                  {
                    case FPE_ZERODIVIDE:  /* ??? */ break;
                }

            }

自从

大多数浮点系统基于 IEEE 标准,允许除以 0。这将根据数字的符号返回正无穷大或负无穷大。(除了 0/0 返回未定义的 NAN——这也不是例外情况。)这往往对科学和数学应用很有用。NAN 有效地表明了计算不可行但允许继续计算的情况。继续计算不会产生新的结果,但会继续返回 NAN。这允许在不检查计算中的错误检查的情况下执行长长的计算链。错误检查只需要在工作的最后进行。这使得代码更简单也更快。对于某些应用程序,它有时也可能更有用,

于 2009-03-06T09:40:47.190 回答
3

不 - 没有抛出异常(你得到一个信号 - 可能是 SIGFPE)。您需要检查代码中可能被零除,然后自己抛出异常,

于 2009-03-06T09:50:10.567 回答
3

如果这完全导致运行时错误(请参阅lakshmanaraj 关于 IEEE 数学的精彩讨论,尽管某些编译器会让您强制错误而不是 NaN),它会抛出一个浮点异常信号

信号是与 c++ 异常不同的机制,并且在操作系统级别进行处理。已经有许多关于 *nix 信号机制的 SO 问题,包括:

对于windows,你必须问别人。Mac OS X 是 - 当然 - 一个 unix 派生系统。

于 2009-03-06T15:50:47.660 回答