如何在Linux C ++中捕获系统级exception?

下面的catch()不被调用:

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

有没有办法来捕捉这种exception?

Solutions Collecting From Web of "如何在Linux C ++中捕获系统级exception?"

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

或者,安装一个SIGFPE处理程序可能是一个选项,一个浮点div由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 – 再次不是一个例外情况。)这往往是有用的科学和数学应用程序。 NANs有效地表示计算不可用但允许计算继续的情况。 持续的计算不会产生新的结果,但将继续返回NAN。 这样可以在计算过程中进行长时间的计算,而不需要计算错误。 错误检查只需要在工作结束时执行。 这使代码更简单,也更快。 在某些应用中,它也可以更有用,无限性是一个“有用的”结果,并不是真正的问题迹象。

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

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

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

  • 什么是Unix的信号?
  • sigaction和signal有什么区别?

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