FreeBSD Manual Pages
std::set_terminate(3) C++ Standard Libary std::set_terminate(3) NAME std::set_terminate - std::set_terminate Synopsis Defined in header <exception> std::terminate_handler set_terminate( std::terminate_handler f ) (until C++11) throw(); std::terminate_handler set_terminate( std::terminate_handler f ) (since C++11) noexcept; 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 (since C++11) std::set_terminate and std::get_terminate. Parameters f - pointer to function of type std::terminate_handler, or null pointer Return value The previously-installed terminate handler, or a null pointer value if none was installed. Example // Run this code #include <cstdlib> #include <exception> #include <iostream> 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. // Run this code #include <iostream> #include <thread> void run() { throw std::runtime_error("Thread failure"); } int main() { try { std::thread t{run}; t.join(); return EXIT_SUCCESS; } catch (const std::exception& exc) { std::cerr << "Exception: " << exc.what() << '\n'; } catch (...) { std::cerr << "Unknown exception caught\n"; } return EXIT_FAILURE; } 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 per- formed. // Run this code #include <iostream> #include <thread> class foo { public: foo() { std::cerr << "foo::foo()\n"; } ~foo() { std::cerr << "foo::~foo()\n"; } }; // Static object, expecting destructor on exit foo f; void run() { throw std::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 (const std::exception& exc) { std::cerr << "Exception: " << exc.what() << '\n'; } catch (...) { std::cerr << "Unknown exception caught\n"; } std::exit(EXIT_FAILURE); }); std::thread t{run}; t.join(); } Output: foo::foo() Exception: Thread failure foo::~foo() See also terminate function called when exception handling fails (function) get_terminate obtains the current terminate_handler (C++11) (function) terminate_handler the type of the function called by std::terminate (typedef) http://cppreference.com 2024.06.10 std::set_terminate(3)
NAME | Synopsis | Parameters | Return value | Example | Possible output: | Possible output: | Output: | See also
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::set_terminate&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>
