【问题标题】:How do I catch system-level exceptions in Linux C++?如何在 Linux C++ 中捕获系统级异常?
【发布时间】:2010-10-11 17:15:04
【问题描述】:

下面的 catch() 没有被调用:

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

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

【问题讨论】:

    标签: c++ linux exception try-catch


    【解决方案1】:

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

    或者,安装 SIGFPE 处理程序可能是一种选择, 一个浮点 0 的 div 然后会生成一个 '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。这允许在不检查计算中的错误检查的情况下执行长长的计算链。错误检查只需要在工作的最后进行。这使得代码更简单也更快。它有时也可能更有用,因为对于某些应用程序,无穷大是一个“有用”的结果,而不是真正的问题迹象。

    【讨论】:

    • 请注意,选项 -mcheck-zero-division 特定于 MIPS 架构。例如。它不适用于 x86。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果这完全导致运行时错误(请参阅lakshmanaraj's nice discussion on IEEE maths,尽管某些编译器会让您强制错误而不是 NaN),它会引发浮点异常信号

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

      对于 Windows,您必须询问其他人。 Mac OS X 是 - 当然 - 一个 unix 派生系统。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多