【发布时间】:2016-12-05 10:12:03
【问题描述】:
这段 C++ 代码崩溃,因为它包含被零除的错误:
int main()
{
try {
int i = 0;
int j = 1 / i;
} catch(...) {}
return 0;
}
是否有可能在不同的平台上捕捉到这样的错误?如果你只知道一些平台,那么你可能会回答你知道的那些。
我对 Windows 上的 SEH 和 Linux 上的信号有一个基本的了解,但我不确定是否有一种方法可以像 C++ 中的软件错误一样捕获各种硬件错误。
最后,看起来除零异常可以在 Python 中捕获:
try:
i = 0
j = 1 / i
except:
pass
在 Java 中:
public class Main {
public static void main(String[] args) {
try {
int i = 0;
int j = 1 / i;
} catch (Exception e) {}
}
}
那么是什么阻止了它们被 C++ 捕获?
【问题讨论】:
-
这是一个未定义的行为,它不是一个例外
-
如果您将其缩小到单个平台,您将有更好的机会得到答案。就目前而言,它相当广泛。
-
阻止他们陷入 C++ 的原因是 C++ 已经决定“尽可能快,即使这意味着不同平台的行为不同”。因此,1/0 只保留所有寄存器不变的平台就可以了。 Java 和 Python 已决定“所有平台的行为都相同”,因此在进行划分之前必须检查是否为零。
-
独立平台?不,C++ 语言对此没有任何支持。正如您在问题中提到的那样,这必然是特定于平台的。除非您将其缩小到特定平台,否则这是您将获得的最佳答案。而且我不认为这是一个实际的答案,所以我投票结束这个问题,因为“太宽泛”了。
标签: c++ linux windows macos exception