.NET Framework Class Library
Application.ThreadException Event

Occurs when an untrapped thread exception is thrown.

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in system.windows.forms.dll)

Syntax

Visual Basic (Declaration)
Public Shared Event ThreadException As ThreadExceptionEventHandler
Visual Basic (Usage)
Dim handler As ThreadExceptionEventHandler

AddHandler Application.ThreadException, handler
C#
public static event ThreadExceptionEventHandler ThreadException
C++
public:
static event ThreadExceptionEventHandler^ ThreadException {
    void add (ThreadExceptionEventHandler^ value);
    void remove (ThreadExceptionEventHandler^ value);
}
J#
/** @event */
public static void add_ThreadException (ThreadExceptionEventHandler value)

/** @event */
public static void remove_ThreadException (ThreadExceptionEventHandler value)
JScript
JScript supports the use of events, but not the declaration of new ones.
Remarks

This event allows your Windows Forms application to handle otherwise unhandled exceptions. Attach your event handlers to the ThreadException event to deal with these exceptions, which will leave your application in an unknown state. Where possible, exceptions should be handled by a structured exception handling block.

Example

The following code example raises a ThreadException event when button1 on the form is clicked. The example creates two classes. The ErrorHandler class creates the form and button that raises the event. The CustomExceptionHandler class provides the methods to handle the exception.

In Main in the ErrorHandler class, the code creates a new instance of the exception handling class, that is, an instance of the CustomExceptionHandler. Then the instance is added to the event, and the application is run.

In the OnThreadException method in the CustomExceptionHandler class, the example uses a try...catch...finally statement to process the exception. The ShowThreadExceptionDialog method creates the message to display, and displays it in a message box.

Visual Basic
' Creates a class to throw the error.
Public Class ErrorHandler
   Inherits System.Windows.Forms.Form

   ' Inserts the code to create a form with a button.

   ' Programs the button to throw an exception when clicked.
   Private Sub button1_Click(sender As object, e As System.EventArgs)
      Throw New ArgumentException("The parameter was invalid")
   End Sub

   <STAThread()> _
   Shared Sub Main()
      ' Creates an instance of the methods that will handle the exception.
      Dim eh As CustomExceptionHandler = New CustomExceptionHandler()

      ' Adds the event handler to the event.
      AddHandler Application.ThreadException, AddressOf eh.OnThreadException

      ' Runs the application.
      Application.Run(new ErrorHandler())
   End Sub
End Class

' Creates a class to handle the exception event.
Private Class CustomExceptionHandler

   ' Handles the exception event.
   Public Sub OnThreadException(sender As object, t As ThreadExceptionEventArgs) 
      Dim result As DialogResult = System.Windows.Forms.DialogResult.Cancel
      Try
         result = Me.ShowThreadExceptionDialog(t.Exception)
      Catch
         Try
            MessageBox.Show("Fatal Error", "Fatal Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop)
         Finally
            Application.Exit()
         End Try
      End Try

      ' Exits the program when the user clicks Abort.
      If (result = System.Windows.Forms.DialogResult.Abort) Then
         Application.Exit()
      End If
   End Sub

   ' Creates the error message and displays it.
   Private Function ShowThreadExceptionDialog(e As Exception) As DialogResult
      Dim errorMsg As StringWriter = New StringWriter()
      errorMsg.WriteLine("An error occurred please contact the adminstrator with the following information:")
      errorMsg.WriteLine("")
      errorMsg.WriteLine(e.Message)
      errorMsg.WriteLine("")
      errorMsg.WriteLine("Stack Trace:")
      errorMsg.WriteLine(e.StackTrace)
      Return MessageBox.Show(errorMsg.ToString(), "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop)
   End Function
End Class
C#
// Creates a class to throw the error.
 public class ErrorHandler : System.Windows.Forms.Form {
 
    // Inserts the code to create a form with a button.
 
    // Programs the button to throw an exception when clicked.
    private void button1_Click(object sender, System.EventArgs e) {
       throw new ArgumentException("The parameter was invalid");
    }
 
    public static void Main(string[] args) {
       // Creates an instance of the methods that will handle the exception.
       CustomExceptionHandler eh = new CustomExceptionHandler();
 
       // Adds the event handler to to the event.
       Application.ThreadException += new ThreadExceptionEventHandler(eh.OnThreadException);
 
       // Runs the application.
       Application.Run(new ErrorHandler());
    }
 }
 
 // Creates a class to handle the exception event.
 internal class CustomExceptionHandler {
 
    // Handles the exception event.
    public void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    {
       DialogResult result = DialogResult.Cancel;
       try
       {
          result = this.ShowThreadExceptionDialog(t.Exception);
       }
       catch
       {
          try
          {
             MessageBox.Show("Fatal Error", "Fatal Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
          }
          finally
          {
             Application.Exit();
          }
       }

       // Exits the program when the user clicks Abort.
       if (result == DialogResult.Abort) 
          Application.Exit();
    }
 
    // Creates the error message and displays it.
    private DialogResult ShowThreadExceptionDialog(Exception e) {
       string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
       errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
       return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
    }
 }
C++
   // Creates a class to throw the error.
public:
   ref class ErrorHandler: public System::Windows::Forms::Form
   {
      // Inserts the code to create a form with a button.

      // Programs the button to throw an exception when clicked.
   private:
      void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ )
      {
         throw gcnew ArgumentException( "The parameter was invalid" );
      }

   public:
      static void Main()
      {
         // Creates an instance of the methods that will handle the exception.
         CustomExceptionHandler ^ eh = gcnew CustomExceptionHandler;
         
         // Adds the event handler to to the event.
         Application::ThreadException += gcnew ThreadExceptionEventHandler( eh, &Form1::CustomExceptionHandler::OnThreadException );
         
         // Runs the application.
         Application::Run( gcnew ErrorHandler );
      }
   };

   // Creates a class to handle the exception event.
internal:
   ref class CustomExceptionHandler
   {
      // Handles the exception event.
   public:
      void OnThreadException( Object^ /*sender*/, ThreadExceptionEventArgs^ t )
      {
         System::Windows::Forms::DialogResult result = ::DialogResult::Cancel;
         try
         {
            result = this->ShowThreadExceptionDialog( t->Exception );
         }
         catch ( Exception^ ) 
         {
            try
            {
               MessageBox::Show( "Fatal Error", "Fatal Error", MessageBoxButtons::AbortRetryIgnore, MessageBoxIcon::Stop );
            }
            finally
            {
               Application::Exit();
            }
         }
         
         // Exits the program when the user clicks Abort.
         if ( result == ::DialogResult::Abort )
         {
            Application::Exit();
         }
      }

      // Creates the error message and displays it.
   private:
      System::Windows::Forms::DialogResult ShowThreadExceptionDialog( Exception^ e )
      {
         String^ errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
         errorMsg = String::Concat( errorMsg, e->Message, "\n\nStack Trace:\n", e->StackTrace );
         return MessageBox::Show( errorMsg, "Application Error", MessageBoxButtons::AbortRetryIgnore, MessageBoxIcon::Stop );
      }
   };
J#
// Creates a class to throw the error.
public static class ErrorHandler extends System.Windows.Forms.Form
{
    // Inserts the code to create a form with a button.
    // Programs the button to throw an exception when clicked.
    private void button1_Click(Object sender, System.EventArgs e)
    {
        throw new ArgumentException("The parameter was invalid");
    } //button1_Click

    public static void main(String[] args)
    {
        // Creates an instance of the methods that will handle 
        // the exception.
        CustomExceptionHandler eh = new CustomExceptionHandler();

        // Adds the event handler to to the event.
        Application.add_ThreadException(
            new ThreadExceptionEventHandler(eh.OnThreadException));

        // Runs the application.
        Application.Run(new ErrorHandler());
    } //main
} //ErrorHandler

// Creates a class to handle the exception event.
static class CustomExceptionHandler
{
    // Handles the exception event.
    public void OnThreadException(Object sender, ThreadExceptionEventArgs t)
    {
        DialogResult result = DialogResult.Cancel;
        try {
            result = this.ShowThreadExceptionDialog(t.get_Exception());
        }
        catch (System.Exception exp) {
            try {
                MessageBox.Show("Fatal Error", "Fatal Error", 
                    MessageBoxButtons.AbortRetryIgnore, 
                    MessageBoxIcon.Stop);
            }
            finally {
                Application.Exit();
            }
        }

        // Exits the program when the user clicks Abort.
        if (result.Equals(DialogResult.Abort)) {
            Application.Exit();
        }
    } //OnThreadException

    // Creates the error message and displays it.
    private DialogResult ShowThreadExceptionDialog(System.Exception e)
    {
        String errorMsg = "An error occurred please contact the"
            + " administrator with the following information:\n\n";
        errorMsg = errorMsg + e.get_Message() + "\n\nStack Trace:\n"
            + e.get_StackTrace();
        return MessageBox.Show(errorMsg, "Application Error",
            MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
    } //ShowThreadExceptionDialog
} //CustomExceptionHandler

public static void main(String[] args)
{
    ErrorHandler.main(args);
}//main
.NET Framework Security

Platforms

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

Version Information

.NET Framework

Supported in: 2.0, 1.1, 1.0
See Also

Tags :


Community Content

Marqs
Only the innermost exception is received in the event

Note that only the innermost exception of an exception chain reaches the ThreadException event handler.

For example, if a FileNotFoundException is thrown and you catch it in your code and throw another exception which wraps the FileNotFoundException, the Exception property of the ThreadExceptionEventArgs object in the ThreadException event handler holds the FileNotFoundException, not the wrapping exception as you might expect.

Tags :

Page view tracker