📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
編集の要約なし |
編集の要約なし |
||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
Windowsフォームやコンソールを実装する際、例外が発生する可能性がある個所では、 | Windowsフォームやコンソールを実装する際、例外が発生する可能性がある個所では、<br> | ||
Try-Catch構文によりその例外をキャッチして適切な処置を施す必要がある。 | Try-Catch構文によりその例外をキャッチして適切な処置を施す必要がある。<br><br> | ||
しかし、現実には例外が正しくキャッチ(トラップ)されていないというケースは多々あり、 | しかし、現実には例外が正しくキャッチ(トラップ)されていないというケースは多々あり、<br> | ||
その場合にはアプリケーションの実行中に次のような.NET Framework標準のエラーダイアログが表示されてしまうことになる。 | その場合にはアプリケーションの実行中に次のような.NET Framework標準のエラーダイアログが表示されてしまうことになる。<br> | ||
[[ファイル:Catch exception 01.gif|フレームなし|中央]] | [[ファイル:Catch exception 01.gif|フレームなし|中央]] | ||
<br> | |||
このエラーダイアログは、一般ユーザにとって理解しにくい。PCの操作に自信のない人であれば、これを見た途端に困惑してしまう。 | このエラーダイアログは、一般ユーザにとって理解しにくい。PCの操作に自信のない人であれば、これを見た途端に困惑してしまう。<br> | ||
この事態を避けるために、.NET Framework標準のエラーダイアログを、ユーザライクな自作のエラーダイアログに切り替えたいという要望も多い。 | この事態を避けるために、.NET Framework標準のエラーダイアログを、ユーザライクな自作のエラーダイアログに切り替えたいという要望も多い。<br><br> | ||
ここでは、Windowsフォームやコンソールで処理されていない例外を1カ所でまとめてハンドルする方法を記載する。<br> | |||
ここでは、Windowsフォームやコンソールで処理されていない例外を1カ所でまとめてハンドルする方法を記載する。 | この方法により、ハンドルしたメソッド内で独自に作成したエラーダイアログを表示すれば、前述の要望も実現可能である。<br><br> | ||
この方法により、ハンドルしたメソッド内で独自に作成したエラーダイアログを表示すれば、前述の要望も実現可能である。 | |||
== 処理されていない例外をハンドルするには == | == 処理されていない例外をハンドルするには == | ||
# '''Application.ThreadExceptionイベントの活用''' | # '''Application.ThreadExceptionイベントの活用''' | ||
処理されなかった例外をハンドルするには、WindowsフォームならApplicationクラス(System.Windows.Forms名前空間)の | 処理されなかった例外をハンドルするには、WindowsフォームならApplicationクラス(System.Windows.Forms名前空間)の<br> | ||
ThreadExceptionイベントをハンドルして処理する。 | ThreadExceptionイベントをハンドルして処理する。<br> | ||
このイベントは、Windowsフォームのメインスレッド(ApplicationクラスのRunメソッドにより実行されるアプリケーションのコンテキスト)内で | このイベントは、Windowsフォームのメインスレッド(ApplicationクラスのRunメソッドにより実行されるアプリケーションのコンテキスト)内で<br> | ||
発生した未処理の例外をハンドルするためのものである。 | 発生した未処理の例外をハンドルするためのものである。<br><br> | ||
# '''Thread.GetDomain().UnhandledExceptionイベントの活用''' | # '''Thread.GetDomain().UnhandledExceptionイベントの活用''' | ||
では、上記のメイン・スレッド以外のコンテキスト上で発生した例外は、 | では、上記のメイン・スレッド以外のコンテキスト上で発生した例外は、<br> | ||
現在のアプリケーションドメイン(AppDomainクラス(System名前空間)のThread.GetDomainメソッドにより取得できる)の | 現在のアプリケーションドメイン(AppDomainクラス(System名前空間)のThread.GetDomainメソッドにより取得できる)の<br> | ||
UnhandledExceptionイベントで出来る。 | UnhandledExceptionイベントで出来る。<br><br> | ||
例えば、マルチスレッド処理において、メインスレッド以外のスレッドで発生した例外やコンソールで発生した例外等は、 | 例えば、マルチスレッド処理において、メインスレッド以外のスレッドで発生した例外やコンソールで発生した例外等は、<br> | ||
全てこのUnhandledExceptionイベントをハンドルして処理すればよい。 | 全てこのUnhandledExceptionイベントをハンドルして処理すればよい。<br><br> | ||
上記2つのイベントを活用して未処理の例外を実際に処理しているのが、次のサンプルコードである。 | 上記2つのイベントを活用して未処理の例外を実際に処理しているのが、次のサンプルコードである。<br><br> | ||
== サンプルコード == | == サンプルコード == | ||