Reputation: 13172
In the following code, at the first iteration I get an exception, and at the second one I get a segmentation fault with no error message printed. It seems the exception is not caught:
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
Is it normal, or there is something really wrong going on?
In case it should be relevant, in that code block I reset a MySQL connection, and the exception is generated when I check if the connection is closed.
Thank's.
Platform:
Linux - OpenSuse 11.4
C++ - GCC 4.5.1
Intel Xeon
Upvotes: 8
Views: 21275
Reputation: 129374
Since segfaults are not caused (directly) the the software, but rather by the processor detecting that you are trying to access invalid memory (or access memory in an invalid way - e.g writing to memory that is write-protected, executing memory that isn't supposed to be executed, etc), it is not "catchable" with try/catch
, which is designed to catch software that throws an exception. They are both called exceptions, but they originate at different levels of the software/hardware of the system.
Technically, you can catch segfaults with a signal handler for SIGSEGV
. However, as Ivaylo explains, it's is not, typically, allowed to just "try again" if you get a segfault. The signal hander for SIGSEGV
is allowed to longjmp
or exit
, but shouldn't just return.
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.
Upvotes: 23
Reputation: 76315
catch
clauses catch exceptions that are thrown by throw
expressions. In standard C++ (and in any sane C++ implementation) they do not catch errors detected by the operating system or by the hardware. To do otherwise would make it far too hard to write exception-safe code.
Upvotes: 1
Reputation: 70939
You can not catch segmentation fault like that. This error is usually unrecoverable and is not handled by the usual try-catch. It means something went very wrong probably stack corruption or similar. Try using valgrind to detect what causes the segmentation fault.
Upvotes: 5