在下面的代码中,在第一次迭代中我得到一个异常,在第二次迭代中我得到一个分段错误而没有打印出错误消息。似乎没有抓住异常:
int i = 0;
while(i++ < 10)
{
try {
cout << "Iteration: " << i << endl;
// Code...
cout << "OK" << endl;
}
catch(...)
{
cerr << "Error message" << endl;
continue;
}
}
Output:
Iteration 1
Error message
Iteration 2
Segmentation fault
是正常的,还是出现了一些真正的错误?
如果它应该是相关的,那么在该代码块中我重置一个MySQL连接,当我检查连接是否关闭时会产生异常。
感谢的。
平台:
Linux - OpenSuse 11.4
C ++ - GCC 4.5.1
英特尔至强
答案 0 :(得分:17)
由于段错误不是(直接)引起软件,而是由处理器检测到您正在尝试访问无效内存(或以无效方式访问内存 - 例如写入写保护的内存,执行内存这不应该被执行,等等,它不是try/catch
的“可捕获”,它被设计用于捕获引发异常的软件。它们都被称为异常,但它们起源于系统的软件/硬件的不同级别。
从技术上讲,您可以使用SIGSEGV
的信号处理程序捕获段错误。但是,正如Ivaylo所解释的那样,如果你遇到段错误,通常不允许“再试一次”。 SIGSEGV
的信号处理者可以longjmp
或exit
,但不应该返回。
在此处阅读有关信号的更多信息: http://www.alexonlinux.com/signal-handling-in-linux
典型的C ++异常(throw
的结果)可以毫无问题地重试(当然,当然也可以再次抛出相同的异常。
答案 1 :(得分:5)
你不能像那样捕捉分段错误。此错误通常是不可恢复的,并且不会由通常的try-catch处理。这意味着某些东西非常错误,可能是堆栈损坏或类似情况。尝试使用valgrind来检测导致分段错误的原因。
答案 2 :(得分:1)
catch
子句捕获throw
表达式引发的异常。在标准C ++(以及任何理智的C ++实现)中,它们不捕获操作系统或硬件检测到的错误。否则会使编写异常安全的代码变得非常困难。