特定の例外が発生したらメッセージボックスで通知し、アプリ自体は落とさないようにした(そういう要望なのだ)。
Form.Loadイベント内で例外が起きた場合、そのフォームでメッセージボックスを出してしまうと、その後、そのフォームが表示されてしまうので、Loadイベント内ではトラップせず、そのフォームの表示元でトラップするようにした。
try
{
using( Form form = new SomeForm() )
{
form.ShowDialog();
}
}
catch( SomeException ex )
{
MessageBox.Show( ex.Message );
}
で、それ以外の例外が発生した場合はログに残して落とすため、Application.ThreadExceptionイベントをハンドルし、この中で例外を再送するようにした(このイベントをハンドルすると例外をキャッチしたものとみなされるらしく、自動ではそれ以上伝播しない)。
static void Application_ThreadException( object sender, ThreadExceptionEventArgs e )
{
//ここでログを出す処理
throw e.Exception;
}
どういうわけか、ThreadExceptionをハンドルしなければ、ShowDialogの下に書いたcatchで捕まる例外が、ThreadExceptionをハンドルするとこっちに飛んでくるようになった。
そして、ThreadExceptionの中から投げた例外はキャッチできず、メッセージボックスを出して継続するはずだった例外でも落ちてしまう結果となった。
なんで?