|
|
Defined in header <exception> | ||
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) | |
Makesf the new global terminate handler function and returns the previously installedstd::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 | (since C++11) |
Contents |
f | - | pointer to function of typestd::terminate_handler, or null pointer |
The previously-installed terminate handler, or a null pointer value if none was installed.
#include <cstdlib>#include <exception>#include <iostream> int main(){ std::set_terminate([](){std::cout<<"Unhandled exception\n"<<std::flush;std::abort();});throw1;}
Possible output:
Unhandled exceptionbash: 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 atry/catch block. In the following example, since the exception is unhandled,std::terminate will be called.
#include <iostream>#include <thread> void run(){throwstd::runtime_error("Thread failure");} int main(){try{std::thread t{run}; t.join();returnEXIT_SUCCESS;}catch(conststd::exception& ex){std::cerr<<"Exception: "<< ex.what()<<'\n';}catch(...){std::cerr<<"Unknown exception caught\n";}returnEXIT_FAILURE;}
Possible output:
terminate called after throwing an instance of 'std::runtime_error' what(): Thread failureAborted (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.
#include <iostream>#include <thread> class foo{public: foo(){std::cerr<<"foo::foo()\n";} ~foo(){std::cerr<<"foo::~foo()\n";}}; // Static object, expecting destructor on exitfoo f; void run(){throwstd::runtime_error("Thread failure");} int main(){ std::set_terminate([](){try{std::exception_ptr eptr{std::current_exception()};if(eptr){std::rethrow_exception(eptr);}else{std::cerr<<"Exiting without exception\n";}}catch(conststd::exception& ex){std::cerr<<"Exception: "<< ex.what()<<'\n';}catch(...){std::cerr<<"Unknown exception caught\n";}std::exit(EXIT_FAILURE);}); std::thread t{run}; t.join();}
Output:
foo::foo()Exception: Thread failurefoo::~foo()
function called when exception handling fails (function)[edit] | |
(C++11) | obtains the current terminate_handler (function)[edit] |
the type of the function called bystd::terminate (typedef)[edit] |