#pragma once #include #include #include namespace ddkit { namespace utils { namespace exceptions { class GlobalHandler { public: template static void registerHandler(std::function handler){ instance().m_registeredHandlers.push_back([handler](std::exception_ptr exceptionPtr){ try { std::rethrow_exception(exceptionPtr); } catch (Exception& e) { handler(e); } catch (...){ // NO OP } }); } static void registerHandler(std::function handler){ instance().m_registeredHandlers.push_back(handler); } private: std::terminate_handler m_previousHandler; std::vector> m_registeredHandlers; GlobalHandler(); void handleException(const std::exception_ptr&); static GlobalHandler& instance(); static void terminateHandler(); }; } // namespace exceptions } // namespace utils } // namespace ddkit