Not all exceptions can be caught. Quoting from [except.handle], p13 of N3000
, the current Working Draft of the C++ standard:
Exceptions thrown in destructors of objects with static storage duration or in constructors of namespace-scope objects with static storage duration are not caught by a function-try-block on
main(). Exceptions thrown in destructors of objects with thread storage duration or in constructors of namespace-scope objects with thread storage duration are not caught by a function-try-block on the initial function of the thread.
To illustrate using an example:
struct Foo {
Foo(); // may throw
~Foo(); // may throw
};
Foo A;
void bar() {
static Foo B;
}
int main()
try {
bar();
// other executable statements
}
catch(...) {
// will catch exceptions thrown from bar() and
// any other executable statements in the try
// block above
// IMPORTANT: will not catch exceptions thrown
// from the constructor of the global object A
// or those from the destructor of the static
// local object B defined in bar()
}
Thus, it is important to prevent constructors and destructors of objects with static storage duration to throw exceptions.