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

Pie*_*tro 6 c++ exception-handling exception try-catch segmentation-fault

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

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
Run Code Online (Sandbox Code Playgroud)

这是正常的,还是出现了一些真正的错误?

如果它应该是相关的,那么在该代码块中我重置一个MySQL连接,当我检查连接是否关闭时会产生异常.

谢谢.


平台:
Linux - OpenSuse 11.4
C++ - GCC 4.5.1
Intel Xeon

Mat*_*son 18

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

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

有关信号的更多信息,请访问:http: //www.alexonlinux.com/signal-handling-in-linux

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


izo*_*ica 5

你不能像这样抓住分段错误.此错误通常是不可恢复的,并且不会由通常的try-catch处理.它意味着一些非常错误的可能是堆栈腐败或类似的.尝试使用valgrind来检测导致分段错误的原因.

  • 在解除引用无效指针(null或以其他方式指向未分配区域)时也会发生Segfaults,这是一个非常常见的错误,没有任何戏剧性的堆栈损坏. (6认同)