捕捉されなかった例外がスローされたことを知るここでは、Try...Catch...で捕捉(キャッチ、ハンドル、トラップ)されなかった例外(エラー)がスローされたときに、その例外の情報を知るための方法を紹介します。 Application.ThreadExceptionイベントを使用する方法Windows Forms アプリケーションでは、捕捉されなかった例外がスローされるとApplication.ThreadExceptionイベントが発生します。 以下に例を示します。ここではフォームのLoadイベントハンドラでThreadExceptionイベントハンドラを追加していますが、実際には、エントリポイントの適当な位置(Application.Runメソッドを呼び出す前)に記述したほうがよいでしょう。エントリポイントについて詳しくは、こちらをご覧ください。 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load 'ThreadExceptionイベントハンドラを追加 AddHandler Application.ThreadException, _ AddressOf Application_ThreadException End Sub 'ThreadExceptionイベントハンドラ Public Sub Application_ThreadException(ByVal sender As Object, _ ByVal e As System.Threading.ThreadExceptionEventArgs) Try 'エラーメッセージを表示する MessageBox.Show(e.Exception.Message, "エラー") Finally 'アプリケーションを終了する Application.Exit() End Try End Sub //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //ThreadExceptionイベントハンドラを追加 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler( Application_ThreadException); } //ThreadExceptionイベントハンドラ private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { try { //エラーメッセージを表示する MessageBox.Show(e.Exception.Message, "エラー"); } finally { //アプリケーションを終了する Application.Exit(); } } //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { throw new ApplicationException("テストです。"); } 上記のコードを実行すると、Button1がクリックされて例外がスローされたときにメッセージボックスにメッセージが表示されて(「テストです。」と表示される)、アプリケーションが終了します。 ThreadExceptionイベントハンドラでは、通常、次のような処理を行います。
ThreadExceptionイベントを使う場合は、次のような点に注意する必要があります。
補足:SetUnhandledExceptionModeメソッドは、2番目のパラメータにFalseを指定することにより、アプリケーション例外モードとすることができるようです(デフォルトは、スレッド例外モード)。しかし現在は、SetUnhandledExceptionModeメソッドの2番目のパラメータをFalseにして呼び出すと、例外がスローされます。
AppDomain.UnhandledExceptionイベントを使用する方法AppDomain.UnhandledExceptionイベントによっても捕捉されていない例外を調べることができます。 以下に例を示します。Application.ThreadExceptionイベントの例をUnhandledExceptionイベント用に書き換えただけです。こちらもやはりUnhandledExceptionイベントハンドラを追加するコードをエントリポイントに記述したほうがよいでしょう。 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load 'UnhandledExceptionイベントハンドラを追加 AddHandler System.AppDomain.CurrentDomain.UnhandledException, _ AddressOf CurrentDomain_UnhandledException 'または、次のようにもできる 'Dim curDom As System.AppDomain = System.Threading.Thread.GetDomain() 'AddHandler curDom.UnhandledException, _ ' AddressOf CurrentDomain_UnhandledException End Sub 'UnhandledExceptionイベントハンドラ Private Sub CurrentDomain_UnhandledException(ByVal sender As Object, _ ByVal e As UnhandledExceptionEventArgs) Try Dim ex As Exception = CType(e.ExceptionObject, Exception) 'エラーメッセージを表示する MessageBox.Show(ex.Message, "エラー") Finally 'アプリケーションを終了する Application.Exit() End Try End Sub //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //UnhandledExceptionイベントハンドラを追加 System.AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); //または、次のようにもできる //System.AppDomain curDom = System.Threading.Thread.GetDomain(); //curDom.UnhandledException += // new UnhandledExceptionEventHandler( // CurrentDomain_UnhandledException); } //UnhandledExceptionイベントハンドラ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { try { Exception ex = (Exception)e.ExceptionObject; //エラーメッセージを表示する MessageBox.Show(ex.Message, "エラー"); } finally { //アプリケーションを終了する Application.Exit(); } } UnhandledExceptionイベントを使う場合は、次のような点に注意してください。
Visual Studio 2005以降のVB.NETで、My.Application.UnhandledExceptionイベントを使用する方法Visual Studio 2005以降のVB.NETでは、My.Application.UnhandledExceptionイベントを使用することができます。 My.Application.UnhandledExceptionイベントハンドラは、ApplicationEvents.vbに記述すると便利です。ApplicationEvents.vbは、プロジェクトのプロパティの「アプリケーション」タブにある「アプリケーションイベントの表示」ボタンをクリックすることにより表示できます。(プロジェクトのプロパティは、メニューの「プロジェクト」-「プロパティ」で表示できます。) 以下にApplicationEvents.vbにUnhandledExceptionイベントハンドラを記述した例を示します。 Namespace My Partial Friend Class MyApplication Private Sub MyApplication_UnhandledException( _ ByVal sender As Object, _ ByVal e As Microsoft.VisualBasic.ApplicationServices. _ UnhandledExceptionEventArgs) _ Handles Me.UnhandledException Try 'e.ExitApplicationをTrueにすると、アプリケーションが終了する 'デフォルトでTrueなので、必要ない e.ExitApplication = True MsgBox(e.Exception.Message, MsgBoxStyle.Critical, "エラー") Finally 'アプリケーションを終了する Application.Exit() End Try End Sub End Class End Namespace UnhandledExceptionイベントを使用する際の注意点を以下にあげます。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。
|
|
Copyright(C) DOBON!. All rights reserved.
|