void OnEndSession(wxCloseEvent& event);
     void OnQueryEndSession(wxCloseEvent& event);
 
+#if wxUSE_EXCEPTIONS
+    virtual bool OnExceptionInMainLoop();
+#endif // wxUSE_EXCEPTIONS
+
 protected:
     int    m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT
 
-    /* Windows-specific wxApp definitions */
-
 public:
-
     // Implementation
     static bool RegisterWindowClasses();
     static bool UnregisterWindowClasses();
 
-    // idle processing
-    // ---------------
-
 #if wxUSE_RICHEDIT
     // initialize the richedit DLL of (at least) given version, return TRUE if
     // ok (Win95 has version 1, Win98/NT4 has 1 and 2, W2K has 3)
     // wasn't found at all
     static int GetComCtl32Version();
 
-public:
     // the SW_XXX value to be used for the frames opened by the application
     // (currently seems unused which is a bug -- TODO)
     static int m_nCmdShow;
 
 
 #include "wx/msw/wrapcctl.h"
 
+// For MB_TASKMODAL
+#ifdef __WXWINCE__
+#include "wx/msw/wince/missing.h"
+#endif
+
 #if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
     !defined(__CYGWIN__) && !defined(__DIGITALMARS__) && !defined(__WXWINCE__) && \
     (!defined(_MSC_VER) || (_MSC_VER > 1100))
     delete [] argv;
 }
 
+// ----------------------------------------------------------------------------
+// wxApp idle handling
+// ----------------------------------------------------------------------------
+
 void wxApp::OnIdle(wxIdleEvent& event)
 {
     wxAppBase::OnIdle(event);
     }
 }
 
+// ----------------------------------------------------------------------------
+// other wxApp event hanlders
+// ----------------------------------------------------------------------------
+
 void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
 {
     if (GetTopWindow())
     }
 }
 
+// ----------------------------------------------------------------------------
+// miscellaneous
+// ----------------------------------------------------------------------------
+
 /* static */
 int wxApp::GetComCtl32Version()
 {
     return TRUE;
 }
 
+#if wxUSE_EXCEPTIONS
+
+// ----------------------------------------------------------------------------
+// exception handling
+// ----------------------------------------------------------------------------
+
+bool wxApp::OnExceptionInMainLoop()
+{
+    // ask the user about what to do: use the Win32 API function here as it
+    // could be dangerous to use any wxWindows code in this state
+    switch (
+            ::MessageBox
+              (
+                NULL,
+                _T("An unhandled exception occurred. Press \"Abort\" to \
+terminate the program,\r\n\
+\"Retry\" to exit the program normally and \"Ignore\" to try to continue."),
+                _T("Unhandled exception"),
+                MB_ABORTRETRYIGNORE |
+                MB_ICONERROR| 
+                MB_TASKMODAL
+              )
+           )
+    {
+        case IDABORT:
+            throw;
+
+        default:
+            wxFAIL_MSG( _T("unexpected MessageBox() return code") );
+            // fall through
+
+        case IDRETRY:
+            return false;
+
+        case IDIGNORE:
+            return true;
+    }
+}
+
+#endif // wxUSE_EXCEPTIONS