7

在下面的代码中,在第一次迭代中出现异常,在第二次迭代中出现分段错误,没有打印错误消息。似乎没有捕获异常:

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

4

3 回答 3

20

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

从技术上讲,您可以使用SIGSEGV. 但是,正如 Ivaylo 解释的那样,如果您遇到段错误,通常不允许“重试”。的信号处理SIGSEGV程序允许longjmpor exit,但不应该只是返回。

Read more about signals here: http://www.alexonlinux.com/signal-handling-in-linux

Typical C++ exceptions (result of throw) can be retried without problem (of course, the same exception may be thrown again, of course.

于 2013-02-15T17:33:56.293 回答
5

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

于 2013-02-15T17:09:41.963 回答
1

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

于 2013-02-15T17:28:30.740 回答