show the unhandled exceptions in debug build instead of silently eating them
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 16 Jun 2007 14:20:16 +0000 (14:20 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 16 Jun 2007 14:20:16 +0000 (14:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46490 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/app.tex
include/wx/app.h
src/common/appbase.cpp

index d29ee9d6db8046fdf01a1da2787d0deeff310fe8..3c851113ac804459d205c8a7b18b27b4f15f42e1 100644 (file)
@@ -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}
index 3e3e8c766553860f827b63bb6469d41bb83265a2..d12af8b3ae11f08a3c49b008dcd4e1769bb27fb8 100644 (file)
@@ -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
index 9f3be56cc8f7b1d6b20b016b1804c939fb576074..a24fee59658e20e38eea4c3f51cc04f174ead881 100644 (file)
 #include "wx/ptr_scpd.h"
 #include "wx/tokenzr.h"
 
+#if wxUSE_EXCEPTIONS && wxUSE_STL
+    #include <exception>
+    #include <typeinfo>
+#endif
+
 #if !defined(__WXMSW__) || defined(__WXMICROWIN__)
   #include  <signal.h>      // 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
 
 // ----------------------------------------------------------------------------