在C++中捕获默认异常

4
我在想,像除以零这样的系统异常是否会向应用程序“抛出”什么东西。是否有可能默认情况下通过某种方式捕获它?
我的意思是,我们可以定义一个自定义除法函数,检查空除数并抛出异常,但我认为如果该异常默认被抛出会更好。
//say I do this
int i;
try
{
i /= 0; // My compiler (gcc) did warn abt the divide by zero :-)
}
catch (...)
{
// Can we get here  for this case?
}
2个回答

4

这与操作系统有关。在Windows上,您可以在Visual C++代码中使用catch(...)捕获所谓的结构化异常,包括除以零、访问冲突等,但在Linux上使用gcc编译的代码中则不行。


3
这里的关键观察是,在C++标准中,除以0被视为未定义行为。这意味着各个实现可以自由处理 - 发出信号中断进程、抛出异常、给你的老板打电话告诉他你无法编码,等等。 - Steve Jessop
对于Windows,您可以使用SetUnhandledExceptionFilter安装处理程序,该处理程序反过来可以抛出C++异常,例如从std :: exception派生的异常。 - ur.
你需要在Visual C++中打开/EHa来捕获除零等异常:http://msdn.microsoft.com/en-us/library/1deeycx5%28VS.80%29.aspx - Rob K
谢谢大家。我不知道这个在C++中是未定义的事实。 - Karthik

1

C++标准并没有规定除以零会抛出异常,而是说这是未定义的行为。

此外,当你说:

i /= 0; // My compiler (gcc) did warn abt the divide by zero :-)

如果你除以的东西是一个常量,编译器只能发出警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接