When an exception is thrown, control is transferred to the nearest handler with a type that matches the type of the exception thrown. If no matching handler is directly found within the handlers for a try block in which the exception is thrown, the search for a matching handler continues to dynamically search for handlers in the surrounding try blocks of the same thread. The C++ Standard, [except.handle], paragraph 9 [ISO/IEC 14882-2014], states the following:
If no matching handler is found, the function
std::terminate()
is called; whether or not the stack is unwound before this call tostd::terminate()
is implementation-defined.
...
In this compliant solution, the main entry point handles all exceptions, which ensures that the stack is unwound up to the main()
function and allows for graceful management of external resources:.
Code Block | ||||
---|---|---|---|---|
| ||||
void throwing_func() noexcept(false); void f() { throwing_func(); } int main() { try { f(); } catch (...) { // Handle error } } |
...
In this compliant solution, the thread_start()
handles all exceptions and does not rethrow, allowing the thread to terminate normally:.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <thread> void throwing_func() noexcept(false); void thread_start(void) { try { throwing_func(); } catch (...) { // Handle error } } void f() { std::thread t(thread_start); t.join(); } |
...