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
This commit is contained in:
@@ -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}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user