When developing windows/console applications using .Net, it is recommended to catch the following two exceptions:
- AppDomain.CurrentDomain.UnhandledException
- Application.ThreadException
If there are some uncaught exceptions raised in a app-domain, the system default handler will report the exception and terminates the application by default. And if raised in a thread, the thread may be blocked. Catching UnhandledException and ThreadException events provides us a way of creating robust applications.
The following code segements demonstrate how to make use of the two events:
static void Main() { try { // Setup unhandled exception handlers AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); // Unhandled Forms exceptions will be delivered to our ThreadException handler Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(AppThreadException); // Other code .... } catch( Exception e ) { .... } } /// <summary> /// CLR unhandled exception /// </summary> private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e) { HandleUnhandledException(e.ExceptionObject); } /// <summary> /// Displays dialog with information about exceptions that occur in the application. /// </summary> private static void AppThreadException(object source, System.Threading.ThreadExceptionEventArgs e) { HandleUnhandledException(e.Exception); } private static void HandleUnhandledException(Object o) { Exception exp = o as Exception; MessageBox.Show(exp.Message, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); Application.Exit(); // Shutting down }