Search code examples
c#winformsdebuggingunhandled-exception

How can I make something that catches all 'unhandled' exceptions in a WinForms application?


Up until now, I just put a try/catch block around the Application.Run in the Program.cs entry point to the program. This catches all exceptions well enough in Debug mode, but when I run the program without the debug mode, exceptions don't get handled anymore. I get the unhandled exception box.

I don't want this to happen. I want all exceptions to be caught when running in non-debug mode. The program has multiple threads and preferably all exceptions from them get caught by the same handler; I want to log exceptions in the DB. Does anyone have any advice in how to do this?


Solution

  • Take a look at the example from the ThreadException documentation:

    public static void Main(string[] args)
    {
       // Add the event handler for handling UI thread exceptions to the event.
        Application.ThreadException += new     
      ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
    
      // Set the unhandled exception mode to force all Windows Forms errors
      // to go through our handler.
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    
      // Add the event handler for handling non-UI thread exceptions to the event. 
      AppDomain.CurrentDomain.UnhandledException += new       
      UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    }
    

    You might also want to not catch exceptions when debugging, as this makes it easier to debug. It is somewhat of a hack, but for that you can wrap the above code around with

     if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) { ... }
    

    To prevent catching the exceptions when debugging.

    EDIT: An alternate way to check for your application running inside a debugger that feels cleaner than checking a filename.

    (see comments by moltenform, Kiquenet and Doug)

    if(!System.Diagnostics.Debugger.IsAttached) { ... }
    

    This avoids the problem of using a different debugger than vshost.exe.