次の方法で共有


System.AppDomain.UnhandledException イベント

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

UnhandledException イベントは、キャッチされていない例外の通知を提供します。 これにより、システムの既定のハンドラーがユーザーに例外を報告し、アプリケーションを終了する前に、アプリケーションで例外に関する情報をログに記録できます。 アプリケーションの状態に関する十分な情報が得られる場合は、後で回復するためにプログラム データを保存するなど、他のアクションが実行される可能性があります。 例外が処理されないとプログラム データが破損する可能性があるため、注意が必要です。 ハンドラーは、例外がスローされたときにロックを保持している間も実行されるため、デッドロックが発生する可能性がある他のリソースを待機しないように注意する必要があります。

このイベントは、任意のアプリケーション ドメインで処理できます。 ただし、例外が発生したアプリケーション ドメインでイベントが発生するとは限りません。 例外は、該当する例外ハンドラーが見つからずにスレッドのスタック全体が巻き戻された場合にのみ処理されないため、イベントを発生できる最初の場所は、スレッドが発生したアプリケーション ドメイン内にあります。

UnhandledException イベントが既定のアプリケーション ドメインで処理される場合、スレッドが開始されたアプリケーション ドメインに関係なく、スレッド内のハンドルされない例外に対して発生します。 UnhandledExceptionのイベント ハンドラーを持つアプリケーション ドメインでスレッドが開始された場合、そのアプリケーション ドメインでイベントが発生します。 そのアプリケーション ドメインが既定のアプリケーション ドメインではなく、既定のアプリケーション ドメインにもイベント ハンドラーがある場合、イベントは両方のアプリケーション ドメインで発生します。

たとえば、スレッドがアプリケーション ドメイン "AD1" で起動し、アプリケーション ドメイン "AD2" でメソッドを呼び出し、そこからアプリケーション ドメイン "AD3" でメソッドを呼び出し、そこで例外をスローするとします。 UnhandledException イベントを発生できる最初のアプリケーション ドメインは "AD1" です。 そのアプリケーション ドメインが既定のアプリケーション ドメインでない場合は、既定のアプリケーション ドメインでもイベントを発生させることができます。

Note

共通言語ランタイムは、 UnhandledException イベントのイベント ハンドラーの実行中にスレッドの中止を中断します。

イベント ハンドラーに適切なフラグを持つ ReliabilityContractAttribute 属性がある場合、イベント ハンドラーは制約付き実行領域として扱われます。

.NET Framework 4 以降では、イベント ハンドラーがセキュリティクリティカルで HandleProcessCorruptedStateExceptionsAttribute 属性を持たない限り、スタック オーバーフローやアクセス違反など、プロセスの状態を破損する例外については、このイベントは発生しません。

このイベントのイベント ハンドラーを登録するには、必要なアクセス許可が必要です。または、 SecurityException がスローされます。

イベントの処理の詳細については、「処理とイベントの発生」を参照してください。

ハンドルされない例外のその他のイベント

特定のアプリケーション モデルの場合、メイン アプリケーション スレッドで未処理の例外が発生した場合、 UnhandledException イベントは他のイベントによって割り込まれる可能性があります。

Windows フォームを使用するアプリケーションでは、メイン アプリケーション スレッドでハンドルされない例外が発生すると、Application.ThreadException イベントが発生します。 このイベントが処理される場合、既定の動作では、ハンドルされない例外はアプリケーションを終了しませんが、アプリケーションは不明な状態のままです。 その場合、 UnhandledException イベントは発生しません。 この動作は、アプリケーション構成ファイルを使用するか、Application.SetUnhandledExceptionMode メソッドを使用して、ThreadException イベント ハンドラーがフックされる前にモードをUnhandledExceptionMode.ThrowExceptionに変更することで変更できます。 これは、メイン アプリケーション スレッドにのみ適用されます。 UnhandledException イベントは、他のスレッドでスローされた未処理の例外に対して発生します。

Visual Basic アプリケーション フレームワークは、メイン アプリケーション スレッド ( WindowsFormsApplicationBase.UnhandledException イベント) でハンドルされない例外に対して別のイベントを提供します。 このイベントには、 AppDomain.UnhandledExceptionで使用されるイベント引数オブジェクトと同じ名前のイベント引数オブジェクトがありますが、プロパティは異なります。 特に、このイベント引数オブジェクトには、アプリケーションの実行を継続し、ハンドルされない例外を無視して (アプリケーションを不明な状態のままにする) ExitApplication プロパティがあります。 その場合、 AppDomain.UnhandledException イベントは発生しません。