diff --git a/src/log.cpp b/src/log.cpp index 958bc0b..18ecd4e 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -1,6 +1,7 @@ #include "log.hpp" #include +#include #include #include @@ -151,6 +152,24 @@ namespace anm2ed info("Exiting Anm2Ed"); stderr_redirect_stop(); } + + int log_exceptions(const std::function& callback) + { + try + { + return callback(); + } + catch (const std::exception& e) + { + logger.fatal(std::format("Unhandled exception: {}", e.what())); + } + catch (...) + { + logger.fatal("Unhandled non-standard exception"); + } + + return EXIT_FAILURE; + } } anm2ed::Logger logger; diff --git a/src/log.hpp b/src/log.hpp index e62f24b..483a9b5 100644 --- a/src/log.hpp +++ b/src/log.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -70,6 +71,8 @@ namespace anm2ed ~Logger(); }; + int log_exceptions(const std::function&); + } extern anm2ed::Logger logger; diff --git a/src/main.cpp b/src/main.cpp index 375faca..0bd67b9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include "loader.hpp" +#include "log.hpp" #include "state.hpp" #ifdef _WIN32 @@ -10,16 +11,19 @@ int main(int argc, const char** argv) { - anm2ed::Loader loader(argc, argv); + return anm2ed::log_exceptions([&]() + { + anm2ed::Loader loader(argc, argv); - if (loader.isError) return EXIT_FAILURE; + if (loader.isError) return EXIT_FAILURE; - anm2ed::State state(loader.window, loader.settings, loader.arguments); + anm2ed::State state(loader.window, loader.settings, loader.arguments); - while (!state.isQuit) - state.loop(loader.window, loader.settings); + while (!state.isQuit) + state.loop(loader.window, loader.settings); - return EXIT_SUCCESS; + return EXIT_SUCCESS; + }); } #ifdef _WIN32