2

未処理の例外が .Net でどのように管理されているかについて少し調査していますが、予想外の結果が得られました。それについてどう思うかを共有したいと思います。

最初のものは非常に簡単に見ることができます。フォームを作成したのと同じスレッドで例外をスローするボタンだけで、テストを行うためにこのコードを書きました。

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Throw New Exception()
    End Sub

    Private Sub UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
        MsgBox(String.Format("Exception: {0}. Ending: {1}. AppDomain: {2}", CType(e.ExceptionObject, Exception).Message, e.IsTerminating.ToString(), AppDomain.CurrentDomain.FriendlyName))
    End Sub

    Private Sub UnhandledThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
        MsgBox(String.Format("Exception: {0}. AppDomain: {1}", e.Exception.Message(), AppDomain.CurrentDomain.FriendlyName))
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException
        AddHandler Application.ThreadException, AddressOf UnhandledThreadException
    End Sub
End Class

Visual Studio 内でコードを実行すると、予期したとおりに UnhandledException が呼び出されますが、Windows からアプリケーションを実行すると、代わりに UndhanledThreadException が呼び出されます。¿? ? ¿ ? ?

誰かがここで何が起こっているのか知っていますか?

前もって感謝します。

編集: Application.ThreadExceptionドキュメントを読んだ後、「Windowsフォームスレッド」内で例外が発生したときにApplication.ThreadExceptionが発生したように見えます(それらが何であれ、IMHOは各アプリに1つのWindowsフォームスレッドしかありません)。したがって、Application.ThreadException は、アプリケーションのフォームを作成したスレッドからスローされた例外に関連しており、その他の例外は AppDomain.CurrentDomain.UnhandledException によって処理されます。

4

1 に答える 1

2

はい、これは正常です。デバッガーで実行すると、Application.ThreadException キャッチャーは無効になります。これは、例外を簡単に診断できるようにするためです。同じように動作させるには、Application.SetUnhandledExceptionMode() メソッドを呼び出す必要があります。残念ながら、VB.NET プロジェクトでこれを行うのは難しいため、アプリケーション フレームワークを無効にする必要があります。

手間をかける価値はありません。例外処理コードをテストする場合は、Ctrl+F5 を押してください。

于 2010-04-12T11:56:01.870 に答える