How do I catch system-level exceptions in Linux C++?
不调用以下catch():
1 2 3 4 5 6 7 8 9 10 11 12 | void test(void) { int i=1,j=0,k; try { k = i/j; } catch(...) { ...handle it... } } |
有没有办法捕捉到这种异常?
请检查
http://linux.die.net/man/1/gcc
有一个编译器选项-mcheck-zero-division来处理这个问题。
或者,安装SIGFPE处理程序可能是一个选项,
浮点除以0将生成'FPE_ZERODIVIDE'
1 2 3 4 5 6 7 8 9 10 | 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有效地表明计算不可行但允许计算继续的情况。持续的计算不会产生新的结果,但将继续返回NANs。这允许在计算器内进行错误检查时执行长的长计算链。只需要在工作的最后执行错误检查。这使代码更简单,也更快。对于某些应用来说,它有时也会更有用,不确定性是一个"有用的"结果,而不是真正的问题迹象。
如果这会导致运行时错误(请参阅lakshmanaraj对IEEE数学的讨论,尽管某些编译器会让你强制错误而不是NaN),它会抛出一个浮点异常信号。
信号是与c ++异常不同的机制,并且在操作系统级别处理。关于* nix信号机制已经存在许多SO问题,包括:
- Unix中的信号是什么?
- sigaction和signal之间有什么区别?
对于Windows,你必须问别人。 Mac OS X当然是一个unix派生系统。
不 - 没有抛出异常(你得到一个信号 - 可能是SIGFPE)。您需要在代码中检查可能除以零,然后自己抛出异常,