如何在 Linux C++ 中捕获系统级异常?
题
不会调用以下 catch():
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'
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。这允许在计算器内进行错误检查时执行长的长计算链。只需要在工作的最后执行错误检查。这使代码更简单,也更快。对于某些应用,它有时也可能更有用,但是,“有用”是指“有用”。结果,并不是真正的问题。
其他提示
不 - 没有抛出异常(你得到一个信号 - 可能是SIGFPE)。您需要在代码中检查可能的零除,然后自己抛出异常,
如果这会导致运行时错误(请参阅 lakshmanaraj 关于 IEEE 数学的精彩讨论, ,虽然有些编译器会让你强制错误而不是 NaN),但它会抛出浮点异常 信号.
信号是与 C++ 异常不同的机制,并且在操作系统级别进行处理。已经有很多关于 *nix 信号机制的 SO 问题,包括:
对于windows,你得问别人。Mac OS X 当然是一个 UNIX 衍生系统。
不隶属于 StackOverflow