Fix reporting unhandled exceptions in MSVC

For some reason set_terminate() doesn't work with MSVC2013
master
Piotr Dziwinski 2015-08-16 00:06:27 +02:00
parent 0c670e7699
commit 4d3a0b6602
3 changed files with 53 additions and 47 deletions

View File

@ -135,6 +135,8 @@ int SDL_MAIN_FUNC(int argc, char *argv[])
InitializeEventTypeTexts();
int code = 0;
try
{
while (true)
{
CApplication app(systemUtils.get()); // single instance of the application
@ -169,9 +171,17 @@ int SDL_MAIN_FUNC(int argc, char *argv[])
if (!restarting)
break;
}
}
catch (std::exception& e)
{
CSignalHandlers::HandleUncaughtException(e);
}
catch (...)
{
CSignalHandlers::HandleOtherUncaughtException();
}
logger.Info("Exiting with code %d\n", code);
return code;
}

View File

@ -40,7 +40,6 @@ void CSignalHandlers::Init(CSystemUtils* systemUtils)
signal(SIGABRT, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGILL, SignalHandler);
std::set_terminate(UnhandledExceptionHandler);
}
void CSignalHandlers::SignalHandler(int sig)
@ -73,30 +72,24 @@ std::string demangle(const char* name) {
#else
// For MSVC and others
// In MSVC typeinfo(e).name() should be already demangled
std::string demangle(const char* name) {
std::string demangle(const char* name)
{
return name;
}
#endif
void CSignalHandlers::UnhandledExceptionHandler()
{
std::exception_ptr exptr = std::current_exception();
try
{
std::rethrow_exception(exptr);
}
catch (const std::exception& e)
void CSignalHandlers::HandleUncaughtException(const std::exception& e)
{
std::stringstream ss;
ss << "Type: " << demangle(typeid(e).name()) << std::endl;
ss << "Message: " << e.what();
ReportError(ss.str());
}
catch (...)
void CSignalHandlers::HandleOtherUncaughtException()
{
ReportError("Unknown unhandled exception (not inherited from std::exception)");
}
}
void CSignalHandlers::ReportError(const std::string& errorMessage)
{

View File

@ -28,6 +28,9 @@ class CSignalHandlers
public:
static void Init(CSystemUtils* systemUtils);
static void HandleUncaughtException(const std::exception& e);
static void HandleOtherUncaughtException();
private:
static void SignalHandler(int sig);
static void UnhandledExceptionHandler();