我得到了分段错误而不是异常

时间:2013-02-15 17:07:15

标签: c++ exception exception-handling segmentation-fault try-catch

在下面的代码中,在第一次迭代中我得到一个异常,在第二次迭代中我得到一个分段错误而没有打印出错误消息。似乎没有抓住异常:

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
英特尔至强

3 个答案:

答案 0 :(得分:17)

由于段错误不是(直接)引起软件,而是由处理器检测到您正在尝试访问无效内存(或以无效方式访问内存 - 例如写入写保护的内存,执行内存这不应该被执行,等等,它不是try/catch的“可捕获”,它被设计用于捕获引发异常的软件。它们都被称为异常,但它们起源于系统的软件/硬件的不同级别。

从技术上讲,您可以使用SIGSEGV的信号处理程序捕获段错误。但是,正如Ivaylo所解释的那样,如果你遇到段错误,通常不允许“再试一次”。 SIGSEGV的信号处理者可以longjmpexit,但不应该返回。

在此处阅读有关信号的更多信息: http://www.alexonlinux.com/signal-handling-in-linux

典型的C ++异常(throw的结果)可以毫无问题地重试(当然,当然也可以再次抛出相同的异常。

答案 1 :(得分:5)

你不能像那样捕捉分段错误。此错误通常是不可恢复的,并且不会由通常的try-catch处理。这意味着某些东西非常错误,可能是堆栈损坏或类似情况。尝试使用valgrind来检测导致分段错误的原因。

答案 2 :(得分:1)

catch子句捕获throw表达式引发的异常。在标准C ++(以及任何理智的C ++实现)中,它们捕获操作系统或硬件检测到的错误。否则会使编写异常安全的代码变得非常困难。