2007年06月26日

スレッド内で発生した例外 まとめ

   このエントリーをはてなブックマークに追加 Clip to Evernote
かなり回りくどい書き方をしてきたが、まとめれば以下の通り。
(ThreadPool.QueueUserWorkItemとDelegateのコードは省略)

○スレッド内で未処理の例外がある場合の動作         
Thread                 プログラム強制終了         ○
ThreadPool プログラム強制終了 ○
Timer プログラム継続 × 例外は行方不明
BeginInvoke プログラム継続 × 例外は行方不明
BeginInvoke+EndInvoke プログラム強制終了 ○

○×は、AppDomain.UnhandledExceptionで処理できるかどうか。

結論は、スレッド内で発生した例外は、そのスレッド内で処理しろってこと。
AppDomain.UnhandledException で処理させようとしても、うまくいかない。
もっとも、プログラムが終了してしまってよいのならば、UnhandledException使っても良いけどね。


この記事へのコメント
一部は、Application.ThreadExceptionで拾えますね
Posted by thirase at 2013年06月04日 14:11
コメントありがとうございます。6年前の記事にコメントが付くとは思っていませんでした(^^;
ご指摘のとおり、WindowsFormsアプリケーションの場合は、BeginInvoke+EndInvokeで、Application.ThreadExceptionで例外を拾えますね。この一連の記事では、WindowsFormsアプリ以外での例外処理を想定していたので、BeginInvoke+EndInvoke は、プログラム強制終了としました。
どちらにせよ、BeginInvoke+EndInvokeなんて過去の遺物を使う理由は何もないので、スレッド内で発生した例外は、そのスレッド内で処理せよ、という原則は今でも通用しますね。
Posted by Gushwell at 2013年06月04日 20:21
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50841953