From 1663c65500c557d53e94493b7cf59331852c064d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 16 Jun 2007 14:20:16 +0000 Subject: [PATCH] show the unhandled exceptions in debug build instead of silently eating them git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46490 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/app.tex | 11 +++++++---- include/wx/app.h | 8 ++++---- src/common/appbase.cpp | 38 +++++++++++++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/docs/latex/wx/app.tex b/docs/latex/wx/app.tex index d29ee9d6db..3c851113ac 100644 --- a/docs/latex/wx/app.tex +++ b/docs/latex/wx/app.tex @@ -519,10 +519,13 @@ should return $0$ in case of successful termination. This function is called when an unhandled C++ exception occurs inside \helpref{OnRun()}{wxapponrun} (the exceptions which occur during the program -startup and shutdown might not be caught at all). -Note that the exception type is lost by now, so if you want to really handle -the exception you should override \helpref{OnRun()}{wxapponrun} and put a -try/catch clause around the call to the base class version there. +startup and shutdown might not be caught at all). Notice that by now the main +event loop has been terminated and the program will exit, if you want to +prevent this from happening (i.e. continue running after catching an exception) +you need to override \helpref{OnExceptionInMainLoop}{wxapponexceptioninmainloop}. + +The default implementation shows information about the exception in debug build +but does nothing in the release build. \membersection{wxApp::ProcessMessage}\label{wxappprocessmessage} diff --git a/include/wx/app.h b/include/wx/app.h index 3e3e8c7665..d12af8b3ae 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -197,10 +197,10 @@ public: wxEvent& event) const; // Called when an unhandled C++ exception occurs inside OnRun(): note that - // the exception type is lost by now, so if you really want to handle the - // exception you should override OnRun() and put a try/catch around - // MainLoop() call there or use OnExceptionInMainLoop() - virtual void OnUnhandledException() { } + // the main event loop has already terminated by now and the program will + // exit, if you need to really handle the exceptions you need to override + // OnExceptionInMainLoop() + virtual void OnUnhandledException(); #endif // wxUSE_EXCEPTIONS // event processing functions diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index 9f3be56cc8..a24fee5965 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -45,6 +45,11 @@ #include "wx/ptr_scpd.h" #include "wx/tokenzr.h" +#if wxUSE_EXCEPTIONS && wxUSE_STL + #include + #include +#endif + #if !defined(__WXMSW__) || defined(__WXMICROWIN__) #include // for SIGTRAP used by wxTrap() #endif //Win/Unix @@ -414,12 +419,38 @@ wxAppConsoleBase::HandleEvent(wxEvtHandler *handler, (handler->*func)(event); } +void wxAppConsoleBase::OnUnhandledException() +{ +#ifdef __WXDEBUG__ + // we're called from an exception handler so we can re-throw the exception + // to recover its type + wxString what; + try + { + throw; + } +#if wxUSE_STL + catch ( std::exception& e ) + { + what.Printf("std::exception of type \"%s\", what() = \"%s\"", + typeid(e).name(), e.what()); + } +#endif // wxUSE_STL + catch ( ... ) + { + what = "unknown exception"; + } + + wxMessageOutputBest().Printf( + "*** Caught unhandled %s; terminating\n", what + ); +#endif // __WXDEBUG__ +} + // ---------------------------------------------------------------------------- // exceptions support // ---------------------------------------------------------------------------- -#if wxUSE_EXCEPTIONS - bool wxAppConsoleBase::OnExceptionInMainLoop() { throw; @@ -430,9 +461,6 @@ bool wxAppConsoleBase::OnExceptionInMainLoop() #endif } -#endif // wxUSE_EXCEPTIONS - - #endif // wxUSE_EXCEPTIONS // ---------------------------------------------------------------------------- -- 2.45.2