|
.NET TIPS 適切に処理されなかった例外をキャッチするには?デジタルアドバンテージ 一色 政彦2005/07/01 |
![]() |
|
|
|
Windowsフォーム・アプリケーションやコンソール・アプリケーションを実装する際、例外が発生する可能性がある個所では、基本的に、Try-Catch構文によりその例外をキャッチして適切な処置を施す必要がある。しかし現実には、例外が正しくキャッチ(=トラップ)されていないというケースは多々あり、その場合にはアプリケーションの実行中に次のような.NET Framework標準のエラー・ダイアログが表示されてしまうことになる。
![]() |
| 例外が処理されていない場合に表示されるエラー・ダイアログの例 |
このエラー・ダイアログは、見て分かるとおり、一般的なユーザーにとって分かりやすいものとはいえない。パソコンの操作に自信のない人であれば、これを見た途端に困惑してしまうということもあるだろう。
このような事態を避けるために、.NET標準のエラー・ダイアログを、もっとユーザー・フレンドリな自作のエラー・ダイアログに切り替えたいという要望も、きっと多いのではないだろうか。
そこで本稿では、Windowsアプリケーションやコンソール・アプリケーションで処理されていない例外を、1カ所でまとめてハンドルしてしまう方法を紹介する。この方法によりハンドルしたメソッド内で、独自に作成したダイアログを表示するようにすれば、前述の要望も実現可能である。
処理されていない例外をハンドルするには?
処理されていない例外をハンドルするには、以下の2つの方法が用意されている。
1. Application.ThreadExceptionイベントの活用
処理されなかった例外をハンドルするには、WindowsフォームならApplicationクラス(System.Windows.Forms名前空間)のThreadExceptionイベントをハンドルして処理すればよい。このイベントは、Windowsフォーム・アプリケーションのメイン・スレッド(=ApplicationクラスのRunメソッドにより実行されるアプリケーションのコンテキスト)内で発生した未処理の例外をハンドルするためのものである。
2. Thread.GetDomain().UnhandledExceptionイベントの活用
それでは、上記のメイン・スレッド以外のコンテキスト上で発生した例外は、どのようにしてハンドルすればよいのだろうか? これを行うのが、現在のアプリケーション・ドメイン(=AppDomainクラス(System名前空間)のオブジェクトにより表され、Thread.GetDomainメソッドにより取得できる)のUnhandledExceptionイベントである。
例えば、マルチスレッド・アプリケーションなどにおいて、メイン・スレッド以外のスレッドで発生した例外や、コンソール・アプリケーションで発生した例外などは、すべてこのUnhandledExceptionイベントをハンドルして処理すればよい。
以上、これら2つのイベントを活用して未処理の例外を実際に処理しているのが、次のサンプル・プログラムだ。
|
|
| 処理されていない例外をハンドルするサンプル・プログラム(C#:program.cs) | |
|
|
| 処理されていない例外をハンドルするサンプル・プログラム(VB.NET:program.vb) | |
| このプログラムを実行するには、アプリケーションのエントリポイントを、「ProgramクラスのMainメソッド」に切り替える必要がある。具体的には、Visual Studio .NETの[ソリューション エクスプローラ]でプロジェクト項目を右クリックしてコンテキスト・メニューを表示し、そのメニューから[プロパティ]を選択して[<プロジェクトの> プロパティ ページ]ダイアログを開き、そのダイアログの[共通プロパティ]−[全般]の[スタートアップの設定]の値を「Sub Main」に設定し直せばよい。 | |
このサンプル・プログラムを実行したのが次の画面である。
![]() |
| Application.ThreadExceptionイベントによりハンドルした例外 |
![]() |
| Thread.GetDomain().UnhandledExceptionイベントによりハンドルした例外 |
ここで作成しているダイアログはあまり良い例とはいえないが、より使いやすく、見やすく作り込むことで、ユーザビリティの高いエラー通知ダイアログにすることができるだろう。
なおVisual Studio .NETがインストールされている環境などでは、その設定内容によっては、上記に示した例外をハンドルするためのイベントが発生する前に、デバッガを選択するための[Just-In-Time デバッグ]ダイアログが表示されることがある。このダイアログが表示されるのを抑止する方法については、「TIPS:[アプリケーション・エラー]ダイアログを非表示にするには?」を参照してほしい。![]()
| カテゴリ:Windowsフォーム 処理対象:例外 カテゴリ:コンソール・アプリケーション 処理対象:例外 使用ライブラリ:Applicationクラス(System.Windows.Forms名前空間) 使用ライブラリ:AppDomainクラス(System名前空間) 関連TIPS:[アプリケーション・エラー]ダイアログを非表示にするには? |
| 「.NET TIPS」 |
TechTargetジャパン
- Kinectが切り開く“夢の近未来” (2012/2/2)
日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか? - 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する - SQL Azure Data Sync入門 (2012/1/30)
SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説 - Windows Phoneアプリ市場の現状を分析する (2012/1/27)
Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -





