2008年6月4日
.NET CFでGlobal Exceptionを捕まえたい…
.NET Compact FrameworkでGlobal Exceptionを捕まえたいと言うことで、調べているとCompactじゃなければ以下のような感じで捕まえられるっぽいことが各所に書かれている
要するにメインスレッドの例外はApplication.ThreadExceptionにハンドラを追加して捕まえろ。さらに、メインスレッド以外での例外はUnhandledExceptionにハンドラを追加して捕まえろってことらしい。
ところが…Compact FrameworkにはApplication.ThreadExceptionがない
で、色々調べながらTwitterでつぶやいていると以下のページを教えてもらった(ありがとうございま~す)。
確かにGlobal Exceptionを受けることはできたのですが、上記コードのOnUnhandledExceptionメソッド内でUnhandledExceptionEventArgsのIsTerminatingの値が必ずtrueになるようです。ページにもシッカリ書かれてますね。この値がtrueってことは、CLRが終了中ってことです
つまり、OnUnhandledExceptionメソッドでできることは限られていて、一番実施したかったMessageBoxによる画面への通知は無理なようです(一瞬だけ表示されますが…メインスレッドが終了するためアプリケーションの終了と共に消えてしまいます)。
スタックトレースをファイルに吐き出すくらいはできるかも知れないですけど…。
なんか、以下のページとか見ていると.NET Frameworkでの例外の扱い方がオカシイんじゃないかとさえ思えてきます
- 捕捉されなかった例外がスローされたことを知る: .NET Tips: C#, VB.NET, Visual Studio
- Coding Horror: Console apps and AppDomain.CurrentDomain.UnhandledException
要するにメインスレッドで起こった例外をApplication.ThreadExceptionでなくUnhandledExceptionで拾うことには若干無理があるのではないかと言うのが個人的な結論なのでした。
まぁ、Global Exceptionを拾ってもできることなんて限られてるので、ちゃんと例外はこまめに捕捉するのが王道なんでようけど。
だからと言って、.NET Compact FrameworkにApplication.ThreadExceptionがないのは理解できないです
![]() |
.Net Compact Framework Programming With C# (Microsoft .Net Development Series) Paul Yao by G-Tools |
う~ん、Compact Frameworkの本って…洋書かぁ~会社で買ってもらうかにゃ
しかも、微妙に古いしダメだな。
TrackBack URL :

