HOME >> Tips >> Microsoft.NET >> コードサンプル

ハンドルされていない例外をキャッチする方法

 
文書番号:20205




ハンドルされていない例外をキャッチする方法

”ハンドルされていない例外”とはイベントの中で例外エラーが発生した際、それを適切に処理していない(もしくはされなかった)例外が.NET Framework のエラーメッセージなどで表示されるものです。

デバッグで発生した場合

クリックで拡大


exe 実行で発生した場合

クリックで拡大


exe 実行で発生した場合にはここで「終了」をクリックするとそのままプログラムが終了してしまいます。
通常は例外エラーを適切に処理してこのような状態にならないようにするべきですが、それができない場合もあります。

このような”ハンドルされていない例外”を一括で処理する方法です。
Windows フォームでは「Application.ThreadException」イベントで例外を捕捉することができます。
これ以外の例外エラーは「Application.ThreadException」イベントで捕捉することができます。

これらのイベントを「Sub New」や「Sub Main」などのアプリケーションが起動した直後のイベントで登録することで、発生した例外エラーをキャッチすることができます。

【サンプル】

    
    Public Sub Main()
    
        ' ThreadExceptionイベント・ハンドラを登録する
        AddHandler Application.ThreadException, AddressOf Application_ThreadException
    
        ' UnhandledExceptionイベント・ハンドラを登録する
        AddHandler System.Threading.Thread.GetDomain().UnhandledException, AddressOf Application_UnhandledException
    
    End Sub
    
    ''' <summary>
    ''' 処理されていない例外をキャッチするイベントハンドラ
    '''  (Windowsアプリケーション用)
    ''' </summary>
    Private Shared Sub Application_ThreadException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)
        'エラーメッセージを表示
        MessageBox.Show(e.Exception.ToString, "[Application.ThreadException]例外通知")
    End Sub
    
    ''' <summary>
    ''' 処理されていない例外をキャッチするイベントハンドラ
    '''  (主にコンソール・アプリケーション用)
    ''' </summary>
    Private Shared Sub Application_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
    
        '例外エラーを取得
        Dim ex As Exception = CType(e.ExceptionObject, Exception)
    
        '例外エラーが存在しない場合は処理しない
        If ex Is Nothing Then Return
    
        'エラーメッセージを表示
        MessageBox.Show(ex.ToString, "[Application.UnhandledException]例外通知")
    End Sub
    
【参考情報】

[@IT]適切に処理されなかった例外をキャッチするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/320appexception/appexception.html

[DOBON.NET]捕捉されなかった例外がスローされたことを知る
http://dobon.net/vb/dotnet/programing/unhandledexception.html