未処理の例外が .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 によって処理されます。