std::set_terminate - cppreference.com (original) (raw)
| Defined in header | | | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------- | | std::terminate_handler set_terminate( std::terminate_handler f ) throw(); | | (until C++11) | | std::terminate_handler set_terminate( std::terminate_handler f ) noexcept; | | (since C++11) |
Makes f the new global terminate handler function and returns the previously installed std::terminate_handler. f shall terminate execution of the program without returning to its caller, otherwise the behavior is undefined.
This function is thread-safe. Every call to std::set_terminate synchronizes-with (see std::memory_order) subsequent calls to std::set_terminate and std::get_terminate. | (since C++11) |
---|
[edit] Parameters
[edit] Return value
The previously-installed terminate handler, or a null pointer value if none was installed.
[edit] Example
#include #include #include int main() { std::set_terminate( { std::cout << "Unhandled exception\n" << std::flush; std::abort(); }); throw 1; }
Possible output:
Unhandled exception bash: line 7: 7743 Aborted (core dumped) ./a.out
The terminate handler will also work for launched threads, so it can be used as an alternative to wrapping the thread function with a try/catch block. In the following example, since the exception is unhandled, std::terminate will be called.
Possible output:
terminate called after throwing an instance of 'std::runtime_error' what(): Thread failure Aborted (core dumped)
With the introduction of the terminate handler, the exception thrown from the non-main thread can be analyzed, and exit can be gracefully performed.
Output:
foo::foo() Exception: Thread failure foo::~foo()