次の方法で共有


Application.OnThreadException メソッド

ThreadException イベントを発生させます。

Public Shared Sub OnThreadException( _
   ByVal t As Exception _)
[C#]
public static void OnThreadException(Exceptiont);
[C++]
public: static void OnThreadException(Exception* t);
[JScript]
public static function OnThreadException(
   t : Exception);

パラメータ

  • t
    スローされた例外を表す Exception

解説

このイベントによって、アプリケーションで例外をインテリジェントに処理できるようになります。ウィンドウ プロシージャでスレッドの例外を受け取ると、ウィンドウ プロシージャがこのイベントを呼び出します。イベント ハンドラをこのイベントに結び付けます。

イベントが発生すると、デリゲートを使用してイベント ハンドラが呼び出されます。詳細については、「 イベントの発生 」を参照してください。

System.Windows.Forms.OnThreadException メソッドを使用すると、デリゲートを結び付けずに、派生クラスでイベントを処理することもできます。派生クラスでイベントを処理する場合は、この手法をお勧めします。

メモ    Application クラスには System.Windows.Forms.ThreadException イベントが含まれています。このイベントにイベント ハンドラを結び付けることで、必要なカスタム処理を実行できます。

継承時の注意: 派生クラスで OnThreadException をオーバーライドする場合は、登録されているデリゲートがイベントを受け取ることができるように、基本クラスの OnThreadException を呼び出てください。

使用例

[Visual Basic, C#, C++] フォームで button1 をクリックすることによって、 ThreadException イベントを発生させる例を次に示します。この例では、次の 2 つのクラスを作成します。 ErrorHandler クラスは、フォーム、およびイベントを発生させるボタンを作成します。 CustomExceptionHandler クラスは、例外を処理するためのメソッドを提供します。

[Visual Basic, C#, C++] ErrorHandler クラスの Main では、コードが例外処理クラスの新しいインスタンス (CustomExceptionHandler のインスタンス) を作成します。次に、作成されたインスタンスがイベントに追加され、アプリケーションが実行 (Run) されます。

[Visual Basic, C#, C++] この例では、 CustomExceptionHandler クラスの OnThreadException メソッドで、 try...catch...finally ステートメントを使用して例外を処理しています。 ShowThreadExceptionDialog メソッドは、表示するメッセージを作成し、そのメッセージをメッセージ ボックスに表示します。

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

   ' Inserts code to create a form with a button.

   ' Programs the button to throw the 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

' Create a class to handle the exception event.
Public 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 code to create a form with a button.
 
    // Programs the button to throw the 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 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:
__gc class ErrorHandler : public System::Windows::Forms::Form {

    // Inserts code to create a form with a button.

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

public:
    static void Main() {
        // Creates an instance of the methods that will handle the exception.
        CustomExceptionHandler* eh = new CustomExceptionHandler();

        // Adds the event handler  to the event.
        Application::ThreadException += new ThreadExceptionEventHandler(eh, &Form1::CustomExceptionHandler::OnThreadException);

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

// Creates a class to handle the exception event.
public private:
__gc class CustomExceptionHandler {

    // Handles the exception event.
public:
    void OnThreadException(Object* /*sender*/, ThreadExceptionEventArgs* t) 
    {
        System::Windows::Forms::DialogResult result = System::Windows::Forms::DialogResult::Cancel;
        try
        {
            result = this->ShowThreadExceptionDialog(t->Exception);
        }
        catch( Exception* )
        {
            try
            {
                MessageBox::Show(S"Fatal Error", S"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 = S"An error occurred please contact the adminstrator with the following information:\n\n";
        errorMsg = String::Concat( errorMsg, e->Message, S"\n\nStack Trace:\n", e->StackTrace );
        return MessageBox::Show(errorMsg, S"Application Error", MessageBoxButtons::AbortRetryIgnore, MessageBoxIcon::Stop);
    }
};

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

Application クラス | Application メンバ | System.Windows.Forms 名前空間