我得到的是分段错误,而不是异常
I get a segmentation fault instead of an exception
在下面的代码中,在第一次迭代中我得到了一个异常,在第二次迭代中,我得到了没有打印错误消息的分段错误。似乎没有发现异常:
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
的信号切换器被允许为longjmp
或exit
,但不应该只是返回。
在此处阅读有关信号的更多信息:http://www.alexonlinux.com/signal-handling-in-linux
典型的C++异常(throw
的结果)可以毫无问题地重试(当然,同样的异常也可能再次抛出。
您不能捕捉到这样的分段错误。这个错误通常是不可恢复的,通常的try-catch不会处理。这意味着出现了非常错误的情况,可能是堆栈损坏或类似情况。尝试使用valgrind来检测导致分割错误的原因。
catch
子句捕获throw
表达式引发的异常。在标准C++(以及任何正常的C++实现)中,它们不会捕获操作系统或硬件检测到的错误。否则会使编写异常安全代码变得过于困难。
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 打开CV异常错误,尽管我的代码是正确的
- 异常错误C++ //Visual Studio
- 提升序列化异常错误
- 返回内存异常错误的矢量
- 使用用户定义的函数查找完美数时出现浮点异常错误
- cv::内存位置出现异常错误
- OpenCV未经处理的异常错误
- 分数简化算法,浮点异常错误
- 为什么我会收到浮点异常错误
- 文本框为空时,C++Windows窗体应用程序出现未处理的异常错误
- 文本框为空时C++ Windows 窗体应用程序未处理的异常错误
- 函数传递映射时出现异常错误
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- 未处理的异常错误
- C++:关闭控制台应用后出现异常错误
- 写入对象时运行时引发异常错误
- C++ C# 包装器空异常错误
- Coin3D(Open Inventor)中出现未处理的异常错误
- Stack Pop()函数出现未处理的异常错误