123456789101112131415161718192021222324252627282930313233343536 |
- #include <cstdlib>
- #include <exception>
- #include <util/stream/output.h>
- #include <util/system/backtrace.h>
- #include <util/generic/yexception.h>
- namespace {
- // Avoid infinite recursion if std::terminate is triggered anew by the
- // FancyTerminateHandler.
- thread_local int TerminateCount = 0;
- void FancyTerminateHandler() {
- switch (++TerminateCount) {
- case 1:
- break;
- case 2:
- Cerr << "FancyTerminateHandler called recursively" << Endl;
- [[fallthrough]];
- default:
- abort();
- break;
- }
- if (std::current_exception()) {
- Cerr << "Uncaught exception: " << CurrentExceptionMessage() << '\n';
- } else {
- Cerr << "Terminate for unknown reason (no current exception)\n";
- }
- PrintBackTrace();
- Cerr.Flush();
- abort();
- }
- [[maybe_unused]] auto _ = std::set_terminate(&FancyTerminateHandler);
- }
|