如何在C语言中捕获整数除零异常?

时间:2010-06-23 21:10:57

标签: c math

众所周知如何使用

捕获浮点除零异常
signal(SIGFPE, handler)

但即使我用

设置控制字,它也不会捕获整数除零问题
_control87(0, _MCW_EM ); (MS VC 2010)

SubQuestion_1:如何在不使用SEH EXCEPTION_INT_DIVIDE_BY_ZERO的情况下在Windows中的C程序中捕获整数除零? (在Unix / Linux中,这可以通过使用标准信号/ SIGFPE技术来完成)

编辑: 信号是ANSI C信号处理方法。
_control87是设置浮点控制字的标准Windows函数。

类似的问题:How to handle all errors, including internal C library errors, uniformly

注(来自ISO / IEC 9899:TC2 Annex H.2.2):

“签名的C整数类型为int,long int,long long int,以及相应的 无符号类型与LIA-1兼容。 ...在LIA-1意义上,C的无符号整数类型是“模数”,因为溢出或越界结果会无声地换行。定义有符号整数类型也是模数的实现不需要检测整数溢出,在这种情况下,只需要检测整数除零。

?最终解决方案:

对于Windows:它会引发SEH异常。所以它可以通过使用__try __except来捕获。  作为可能的解决方案,可以使用SEH转换来处理SEH异常并将它们转换为所需功能的调用。它不是一种“自然”的方式,但它似乎是唯一的方式。

对于Unix:它可以通过signal / SIGFPE解决方案捕获。或者查看wiki以获取FPE_INTDIV解决方案(http://rosettacode.org/wiki/Detect_division_by_zero#C)。

由于GMan对“未定义的行为”是对的,我选择他的答案是正确的。

注意:检查VC \ crt \ src \ winxfltr.c:_XcptActTab数组很有意思:)

2 个答案:

答案 0 :(得分:18)

除以零导致未定义的行为,没有C语言结构可以对它做任何事情。你最好的选择是首先通过检查分母来除以零。

如果你想“捕获”(注意,C没有例外)这个错误,它将取决于你没有列出的编译器和操作系统。顺便说一下,_control87只与浮点运算有关,而与整数运算无关。

答案 1 :(得分:0)

检查你的分歧......?

// if below = 0 then do not divide, just put answer as zero

if (below == 0) {
  result = 0;
} else {
  result = above/below;
}