更新 : 2007 年 11 月
名前空間 :
System
アセンブリ :
mscorlib (mscorlib.dll 内)
Public Event UnhandledException As UnhandledExceptionEventHandler
Dim instance As AppDomain
Dim handler As UnhandledExceptionEventHandler
AddHandler instance.UnhandledException, handler
public event UnhandledExceptionEventHandler UnhandledException
public:
virtual event UnhandledExceptionEventHandler^ UnhandledException {
void add (UnhandledExceptionEventHandler^ value);
void remove (UnhandledExceptionEventHandler^ value);
}
/** @event */
public final void add_UnhandledException (UnhandledExceptionEventHandler value)
/** @event */
public final void remove_UnhandledException (UnhandledExceptionEventHandler value)
実装
_AppDomain..::.UnhandledException
このイベントは、キャッチされない例外の通知を提供します。このイベントにより、システムの既定のハンドラが例外をユーザーに報告し、アプリケーションを終了する前に、アプリケーションで例外に関する情報を記録できます。アプリケーションの状態に関する十分な情報を使用できる場合、後で回復に使用するためにプログラム データを保存するなど、その他のアクションが実行される場合もあります。例外が処理されない場合、プログラム データが破損するおそれがあるため、注意が必要です。
メモ : |
|---|
.NET Framework Version 1.0 および 1.1 では、このイベントが発生した後ではなく発生する前に、アプリケーションの終了とデバッグ オプションがユーザーに報告されます。 |
このイベントは、任意のアプリケーション ドメインで処理できます。ただし、このイベントは例外が発生したアプリケーション ドメインで発生するとは限りません。適用できる例外ハンドラを探さずにスレッドのスタック全体がアンワインドされた場合にのみ例外がハンドルされなくなるため、スレッドが開始されたアプリケーション ドメインで最初にイベントが発生することがあります。
メモ : |
|---|
.NET Framework Version 1.0 および 1.1 では、このイベントは、アプリケーションの起動時にシステムによって作成された既定のアプリケーション ドメインに対してだけ発生します。アプリケーションが追加のアプリケーション ドメインを作成する場合、それらの追加アプリケーション ドメインでこのイベントのデリゲートを指定しても無効です。 |
UnhandledException イベントが既定のアプリケーション ドメインで処理される場合、スレッドが開始されたアプリケーション ドメインに関係なく、既定のアプリケーション ドメインですべてのスレッドのすべてのハンドルされていない例外が発生します。UnhandledException のイベント ハンドラを備えたアプリケーション ドメインでスレッドが開始されている場合、そのアプリケーション ドメインでイベントが発生します。そのアプリケーション ドメインが既定のアプリケーション ドメインではなく、既定のアプリケーション ドメインにもイベント ハンドラがある場合、両方のアプリケーション ドメインでイベントが発生します。
たとえば、スレッドがアプリケーション ドメイン "AD1" で開始され、アプリケーション ドメイン "AD2" のメソッドを呼び出し、"AD2" からアプリケーション ドメイン "AD3" のメソッドを呼び出したときに、"AD3" で例外がスローされるとします。UnhandledException イベントが発生する可能性がある最初のアプリケーション ドメインは "AD1" です。このアプリケーション ドメインが既定のアプリケーション ドメインでない場合、このイベントは既定のアプリケーション ドメインでも発生することがあります。
.NET Framework Version 1.0 および 1.1 では、メイン アプリケーション スレッド以外のスレッドで発生するハンドルされていない例外は、ランタイムによってキャッチされるため、アプリケーションは終了しません。したがって、アプリケーションが終了しない UnhandledException イベントが発生する可能性があります。.NET Framework Version 2.0 では、このような応答のない障害が累積するとパフォーマンスの低下、データの破損、およびロックアップを招き、これらはすべてデバッグが難しいため、子スレッドの未処理の例外用のこのバックストップは削除されました。ランタイムが終了しない場合などの詳細については、「マネージ スレッドの例外」を参照してください。
このイベントのイベント ハンドラを登録するには、適切なアクセス許可が必要です。アクセス許可がないと、SecurityException がスローされます。
イベント処理の詳細については、「イベントの利用」を参照してください。
ハンドルされていない例外に関するその他のイベント
特定のアプリケーション モデルでは、ハンドルされていない例外がメイン アプリケーション スレッドで発生した場合、UnhandledException イベントではなく他のイベントが発生することがあります。
Windows フォームを使用するアプリケーションでは、ハンドルされていない例外がメイン アプリケーション スレッドで発生すると Application..::.ThreadException イベントが発生します。このイベントが処理される場合、既定ではハンドルされていない例外によってアプリケーションが終了しませんが、アプリケーションの状態は不明になります。この場合、UnhandledException イベントが発生しません。この動作を変更するには、アプリケーション構成ファイルまたは Application..::.SetUnhandledExceptionMode メソッドを使用して、モードを UnhandledExceptionMode..::.ThrowException に変更した後で、ThreadException イベント ハンドラをフックします。これが適用されるのはメイン アプリケーション スレッドのみです。その他のスレッドでスローされたハンドルされていない例外については、UnhandledException イベントが発生します。
Microsoft Visual Studio 2005 以降の Visual Basic アプリケーション フレームワークでは、メイン アプリケーション スレッドのハンドルされていない例外に関するその他のイベントが用意されています。「My.Application.UnhandledException イベント」を参照してください。このイベントには、AppDomain..::.UnhandledException で使用されるイベント引数オブジェクトと同じ名前のイベント引数オブジェクトがありますが、そのプロパティは異なります。特に、このイベント引数オブジェクトの ExitApplication プロパティを使用すると、アプリケーションの動作を続行し、ハンドルされていない例外を無視することができます (アプリケーションの状態は不明のままです)。この場合、AppDomain..::.UnhandledException イベントが発生しません。
UnhandledException イベントのサンプルを次に示します。
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
Try
Throw New Exception("1")
Catch e As Exception
Console.WriteLine("Catch clause caught : " + e.Message)
End Try
Throw New Exception("2")
' Output:
' Catch clause caught : 1
' MyHandler caught : 2
End Sub 'Main
Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
Console.WriteLine("MyHandler caught : " + e.Message)
End Sub 'MyUnhandledExceptionEventHandler
using System;
using System.Security.Permissions;
public class Test {
[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
public static void Example()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
try {
throw new Exception("1");
} catch (Exception e) {
Console.WriteLine("Catch clause caught : " + e.Message);
}
throw new Exception("2");
// Output:
// Catch clause caught : 1
// MyHandler caught : 2
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
Exception e = (Exception) args.ExceptionObject;
Console.WriteLine("MyHandler caught : " + e.Message);
}
public static void Main() {
Example();
}
}
public ref class Test
{
private:
static void MyHandler( Object^ /*sender*/, UnhandledExceptionEventArgs^ args )
{
Exception^ e = dynamic_cast<Exception^>(args->ExceptionObject);
Console::WriteLine( "MyHandler caught : {0}", e->Message );
}
public:
[SecurityPermissionAttribute( SecurityAction::Demand, ControlAppDomain = true )]
static void Main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
currentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler( Test::MyHandler );
try
{
throw gcnew Exception( "1" );
}
catch ( Exception^ e )
{
Console::WriteLine( "Catch clause caught : {0}", e->Message );
}
throw gcnew Exception( "2" );
// Output:
// Catch clause caught : 1
// MyHandler caught : 2
}
};
int main()
{
Test::Main();
}
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360
.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。
.NET Framework
サポート対象 : 3.5、3.0、2.0、1.1、1.0
.NET Compact Framework
サポート対象 : 3.5、2.0
XNA Framework
サポート対象 : 2.0、1.0
参照