不调用以下 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 处理程序可能是一个选项,浮点 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。这允许在不检查计算中的错误检查的情况下执行长长的计算链。错误检查只需要在工作的最后进行。这使得代码更简单也更快。对于某些应用程序,它有时也可能更有用,
不 - 没有抛出异常(你得到一个信号 - 可能是 SIGFPE)。您需要检查代码中可能被零除,然后自己抛出异常,
如果这完全导致运行时错误(请参阅lakshmanaraj 关于 IEEE 数学的精彩讨论,尽管某些编译器会让您强制错误而不是 NaN),它会抛出一个浮点异常信号。
信号是与 c++ 异常不同的机制,并且在操作系统级别进行处理。已经有许多关于 *nix 信号机制的 SO 问题,包括:
对于windows,你必须问别人。Mac OS X 是 - 当然 - 一个 unix 派生系统。