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}
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
#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
(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;
#endif
}
-#endif // wxUSE_EXCEPTIONS
-
-
#endif // wxUSE_EXCEPTIONS
// ----------------------------------------------------------------------------