From 1663c65500c557d53e94493b7cf59331852c064d Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
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 <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
 
 // ----------------------------------------------------------------------------
-- 
2.45.2

