Add some real exception catching to our wxApp class, now we should be able to get decent messages from all exceptions thrown inside event handlers.

Originally committed to SVN as r4639.
This commit is contained in:
Niels Martin Hansen 2010-06-29 10:31:15 +00:00
parent 201f654ca9
commit 3589353641
2 changed files with 36 additions and 5 deletions

View file

@ -340,6 +340,31 @@ void AegisubApp::OnFatalException() {
#endif #endif
void AegisubApp::HandleEvent(wxEvtHandler *handler, wxEventFunction func, wxEvent& event) const {
#define SHOW_EXCEPTION(str) wxMessageBox(str, L"Exception in event handler", wxOK|wxICON_ERROR|wxSTAY_ON_TOP)
try {
wxApp::HandleEvent(handler, func, event);
}
catch (const agi::Exception &e) {
SHOW_EXCEPTION(lagi_wxString(e.GetChainedMessage()));
}
catch (const std::exception &e) {
SHOW_EXCEPTION(wxString(e.what(), wxConvUTF8));
}
catch (const wchar_t *e) {
SHOW_EXCEPTION(wxString(e));
}
catch (const char *e) {
SHOW_EXCEPTION(wxString(e, wxConvUTF8));
}
catch (const wxString &e) {
SHOW_EXCEPTION(e);
}
#undef SHOW_EXCEPTION
}
#if wxUSE_STACKWALKER == 1 #if wxUSE_STACKWALKER == 1
/// @brief Called at the start of walking the stack. /// @brief Called at the start of walking the stack.
/// @param cause cause of the crash. /// @param cause cause of the crash.

View file

@ -88,8 +88,8 @@ public:
/// DOCME /// DOCME
FrameMain *frame; FrameMain *frame;
#ifdef WITH_AUTOMATION
#ifdef WITH_AUTOMATION
/// DOCME /// DOCME
Automation4::AutoloadScriptManager *global_scripts; Automation4::AutoloadScriptManager *global_scripts;
#endif #endif
@ -115,6 +115,16 @@ public:
void OnFatalException(); void OnFatalException();
#endif #endif
#if defined(wxUSE_EXCEPTIONS)
// This function wraps all event handler calls anywhere in the application and is
// our ticket to catch exeptions happening in event handlers.
virtual void HandleEvent(wxEvtHandler *handler,
wxEventFunction func,
wxEvent& event) const;
#else
# error wxWidgets is compiled without exceptions support, Aegisub requires exceptions support in wxWidgets to run safely
#endif
//int OnRun(); //int OnRun();
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@ -122,11 +132,7 @@ public:
DECLARE_APP(AegisubApp) DECLARE_APP(AegisubApp)
////////////////
// Stack walker
#if wxUSE_STACKWALKER == 1 #if wxUSE_STACKWALKER == 1
/// DOCME
/// @class StackWalker /// @class StackWalker
/// @brief DOCME /// @brief DOCME
/// ///