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

I get a segmentation fault instead of an exception

本文关键字:异常 错误 分段      更新时间:2023-10-16

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

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
Intel Xeon

由于分段故障不是(直接)由软件引起的,而是由处理器检测到您试图访问无效内存(或以无效方式访问内存,例如写入受写保护的内存、执行不应执行的内存等)引起的,因此try/catch无法"捕获"分段故障,其设计用于捕获抛出异常的软件。它们都被称为例外,但它们起源于系统的软件/硬件的不同级别。

从技术上讲,您可以使用SIGSEGV的信号处理程序捕获segfault。然而,正如Ivaylo所解释的,如果你出现segfault,通常不允许"再试一次"。SIGSEGV的信号切换器被允许为longjmpexit,但不应该只是返回。

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

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

您不能捕捉到这样的分段错误。这个错误通常是不可恢复的,通常的try-catch不会处理。这意味着出现了非常错误的情况,可能是堆栈损坏或类似情况。尝试使用valgrind来检测导致分割错误的原因。

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