From cea62f9c12daeab0e69308c93dd1bd6d5547b4c0 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 11 Dec 2003 07:55:06 +0000 Subject: [PATCH] Applied patch [ 819171 ] wxEventLoop::Run silently eats all exceptions... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24736 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/evtloop.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/msw/evtloop.cpp b/src/msw/evtloop.cpp index 7810e76c0b..1012498409 100644 --- a/src/msw/evtloop.cpp +++ b/src/msw/evtloop.cpp @@ -73,6 +73,13 @@ public: int GetExitCode() const { return m_exitcode; } bool ShouldExit() const { return m_shouldExit; } + enum wxCatchAllResponse { + catch_continue, + catch_exit, + catch_rethrow + }; + wxCatchAllResponse OnCatchAll(); + private: // preprocess a message, return TRUE if processed (i.e. no further // dispatching required) @@ -213,6 +220,25 @@ bool wxEventLoopImpl::SendIdleMessage() return wxTheApp->ProcessIdle(); } +// ---------------------------------------------------------------------------- +// wxEventLoopImpl exception handling +// ---------------------------------------------------------------------------- + +wxEventLoopImpl::wxCatchAllResponse wxEventLoopImpl::OnCatchAll() +{ + switch (::MessageBox(NULL, + _T("An unhandled exception occurred. 'Abort' will terminate the program,\r\n" + "'Retry' will close the current dialog, 'Ignore' will try to continue."), + _T("Unhandled exception"), + MB_ABORTRETRYIGNORE|MB_ICONERROR|MB_TASKMODAL)) + { + case IDABORT: return catch_rethrow; + case IDRETRY: return catch_exit; + case IDIGNORE: return catch_continue; + } + return catch_rethrow; +} + // ============================================================================ // wxEventLoop implementation // ============================================================================ @@ -249,13 +275,18 @@ int wxEventLoop::Run() // situations because it is supposed to be called synchronously, // wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or // something similar here) +#if wxUSE_EXCEPTIONS + bool retryAfterException; + do { + retryAfterException=false; +#endif wxTRY { for ( ;; ) { -#if wxUSE_THREADS + #if wxUSE_THREADS wxMutexGuiLeaveOrEnter(); -#endif // wxUSE_THREADS + #endif // wxUSE_THREADS // generate and process idle events for as long as we don't have // anything else to do @@ -281,8 +312,28 @@ int wxEventLoop::Run() break; } } + } + wxCATCH_ALL( + switch (m_impl->OnCatchAll()) { + case wxEventLoopImpl::catch_continue: + retryAfterException=true; + break; + case wxEventLoopImpl::catch_exit: + OnExit(); + break; + case wxEventLoopImpl::catch_rethrow: + OnExit(); + // should be replaced with wx macro, but + // there is none yet. OTOH, wxCATCH_ALL isn't + // expanded unless wxUSE_EXCEPTIONS, so its + // safe to use throw here. + throw; + break; } - wxCATCH_ALL( OnExit(); ) + ) +#if wxUSE_EXCEPTIONS + } while (retryAfterException); +#endif return m_impl->GetExitCode(); } -- 2.45.2