AppDomain.UnhandledException AppDomain.UnhandledException AppDomain.UnhandledException AppDomain.UnhandledException Event

定義

例外がキャッチされない場合に発生します。 Occurs when an exception is not caught.

public:
 virtual event UnhandledExceptionEventHandler ^ UnhandledException;
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event UnhandledExceptionEventHandler UnhandledException;
member this.UnhandledException : UnhandledExceptionEventHandler 
Public Custom Event UnhandledException As UnhandledExceptionEventHandler 
実装
属性

次の例で示します、UnhandledExceptionイベント。The followingexample demonstrates the UnhandledException event. イベント ハンドラーを定義しますMyHandler既定のアプリケーション ドメインでハンドルされない例外がスローされたときに呼び出されます。It defines an event handler, MyHandler, that is invoked whenever an unhandled exception is thrown in the default application domain. 2 つの例外をスローします。It then throws two exceptions. 最初はによって処理される、 try ~ catchブロックします。The first is handled by a try/catch block. 2 つ目が処理されないと起動、MyHandleルーチン、アプリケーションが終了する前にします。The second is unhandled and invokes the MyHandle routine before the application terminates.

// The example should be compiled with the /clr:pure compiler option.
using namespace System;
using namespace System::Security::Permissions;

public ref class Example
{


private:
   static void MyHandler(Object^ sender, UnhandledExceptionEventArgs^ args)
   {
      Exception^ e = dynamic_cast<Exception^>(args->ExceptionObject);
      Console::WriteLine( "MyHandler caught : {0}", e->Message );
      Console::WriteLine("Runtime terminating: {0}", args->IsTerminating);
   }
   
public: 
   [SecurityPermissionAttribute( SecurityAction::Demand, ControlAppDomain = true )]
   static void Main()
   {
      AppDomain^ currentDomain = AppDomain::CurrentDomain;
      currentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(Example::MyHandler);
      try
      {
         throw gcnew Exception("1");
      }
      catch (Exception^ e) 
      {
         Console::WriteLine( "Catch clause caught : {0}\n", e->Message );
      }

      throw gcnew Exception("2");
   }
};

void main()
{
   Example::Main();
}   
// The example displays the following output:
//       Catch clause caught : 1
//       
//       MyHandler caught : 2
//       Runtime terminating: True
//       
//       Unhandled Exception: System.Exception: 2
//          at Example.Main()
//          at mainCRTStartup(String[] arguments)
using System;
using System.Security.Permissions;

public class Example 
{
   [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
   public static void Main()
   {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
      
      try {
         throw new Exception("1");
      } catch (Exception e) {
         Console.WriteLine("Catch clause caught : {0} \n", e.Message);
      }

      throw new Exception("2");
   }
   
   static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
   {
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("MyHandler caught : " + e.Message);
      Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
   }
}
// The example displays the following output:
//       Catch clause caught : 1
//       
//       MyHandler caught : 2
//       Runtime terminating: True
//       
//       Unhandled Exception: System.Exception: 2
//          at Example.Main()  
Module Example
   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)
         Console.WriteLine()
      End Try
      
      Throw New Exception("2")
   End Sub
   
   Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
      Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
      Console.WriteLine("MyHandler caught : " + e.Message)
      Console.WriteLine("Runtime terminating: {0}", args.IsTerminating)
   End Sub
End Module
' The example displays the following output:
'       Catch clause caught : 1
'       
'       MyHandler caught : 2
'       Runtime terminating: True
'       
'       Unhandled Exception: System.Exception: 2
'          at Example.Main()

注釈

このイベントは、キャッチされない例外の通知を提供します。This event provides notification of uncaught exceptions. システムの既定のハンドラーがユーザーに例外を報告、およびアプリケーションの終了前に、例外に関する情報を記録するアプリケーションをできるようにします。It allows the application to log information about the exception before the system default handler reports the exception to the user and terminates the application. その他の操作を行うことがあります、アプリケーションの状態に関する十分な情報を使用できる場合、その後の復旧のプログラムのデータを保存するなど。If sufficient information about the state of the application is available, other actions may be undertaken — such as saving program data for later recovery. 例外が処理されない場合は、プログラムのデータが破壊されることがあるため、警告が表示されます。Caution is advised, because program data can become corrupted when exceptions are not handled.

注意

.NET Framework バージョン 1.0 および 1.1 では、アプリケーションの終了とデバッグ オプションが報告ユーザーではなくより後の前に、このイベントが発生します。In the .NET Framework versions 1.0 and 1.1, application termination and debugging options are reported to the user before this event is raised, rather than after.

このイベントは、任意のアプリケーション ドメインで処理することができます。This event can be handled in any application domain. ただし、イベントは必ずしも発生しませんが、例外が発生したアプリケーション ドメインで。However, the event is not necessarily raised in the application domain where the exception occurred. スレッドのスタック全体が解除されたアンワインドため、まずイベントを発生させることができますが、スレッドが作成されたアプリケーション ドメインでは、該当する例外ハンドラーを検索せず場合にのみ、例外が処理されません。An exception is unhandled only if the entire stack for the thread has been unwound without finding an applicable exception handler, so the first place the event can be raised is in the application domain where the thread originated.

注意

.NET Framework バージョン 1.0 および 1.1 では、このイベントは、アプリケーションを開始するときに、システムによって作成される既定のアプリケーション ドメインに対してのみ発生します。In the .NET Framework versions 1.0 and 1.1, this event occurs only for the default application domain that is created by the system when an application is started. アプリケーションでは、追加のアプリケーション ドメインを作成する場合は、これらのアプリケーション ドメインでこのイベントのデリゲートを指定しても効果はありません。If an application creates additional application domains, specifying a delegate for this event in those applications domains has no effect.

場合、UnhandledExceptionイベントは既定のアプリケーション ドメインで処理のいずれかのハンドルされない例外では、どのようなアプリケーション ドメインに関係なく、任意のスレッド開始されたスレッドにある発生しました。If the UnhandledException event is handled in the default application domain, it is raised there for any unhandled exception in any thread, no matter what application domain the thread started in. イベント ハンドラーにあるアプリケーション ドメインでスレッドが開始したかどうかはUnhandledException、そのアプリケーション ドメインで、イベントが発生します。If the thread started in an application domain that has an event handler for UnhandledException, the event is raised in that application domain. そのアプリケーション ドメインが既定のアプリケーション ドメインと既定のアプリケーション ドメインで、イベント ハンドラーはまた、両方のアプリケーション ドメインで、イベントが発生します。If that application domain is not the default application domain, and there is also an event handler in the default application domain, the event is raised in both application domains.

たとえば、スレッドの起動時あるとします"AD1"のアプリケーション ドメイン"AD2"のアプリケーション ドメインでメソッドを呼び出しし、そこからメソッドを呼び出し、"AD3"のアプリケーション ドメインで例外がスローされます。For example, suppose a thread starts in application domain "AD1", calls a method in application domain "AD2", and from there calls a method in application domain "AD3", where it throws an exception. 最初のアプリケーション ドメインをUnhandledExceptionイベントを発生させることができます"AD1"です。The first application domain in which the UnhandledException event can be raised is "AD1". そのアプリケーション ドメインが既定のアプリケーション ドメインでない場合は、イベントは既定のアプリケーション ドメインにも発生します。If that application domain is not the default application domain, the event can also be raised in the default application domain.

注意

共通言語ランタイムの中断イベント ハンドラーの中にスレッドの中止、UnhandledExceptionイベントを実行します。The common language runtime suspends thread aborts while event handlers for the UnhandledException event are executing.

イベント ハンドラーがある場合、ReliabilityContractAttribute属性、適切なフラグでは、イベント ハンドラーは制約された実行領域として扱われます。If the event handler has a ReliabilityContractAttribute attribute with the appropriate flags, the event handler is treated as a constrained execution region.

以降では、 .NET Framework 4.NET Framework 4、このイベントはスタック オーバーフローなど、プロセスの状態が破損またはイベント ハンドラーがセキュリティ クリティカルであり、違反にアクセスする例外の発生しませんが、HandleProcessCorruptedStateExceptionsAttribute属性。Starting with the .NET Framework 4.NET Framework 4, this event is not raised for exceptions that corrupt the state of the process, such as stack overflows or access violations, unless the event handler is security-critical and has the HandleProcessCorruptedStateExceptionsAttribute attribute.

.NET Framework バージョン 1.0 および 1.1 では、メイン アプリケーション スレッド以外のスレッドで発生した未処理の例外はランタイムによってが検出され、アプリケーションが終了するを発生しません。In the .NET Framework versions 1.0 and 1.1, an unhandled exception that occurs in a thread other than the main application thread is caught by the runtime and therefore does not cause the application to terminate. したがって、ことができる、UnhandledExceptionイベントが、アプリケーションを終了せずに発生します。Thus, it is possible for the UnhandledException event to be raised without the application terminating. 以降、.NET Framework version 2.0 では、この安全策子スレッドのハンドルされない例外のため、削除されましたサイレントこのような障害の影響が累積には、パフォーマンスの低下には、破損したデータにはすべての困難がハングアップが含まれていますデバッグします。Starting with the .NET Framework version 2.0, this backstop for unhandled exceptions in child threads was removed, because the cumulative effect of such silent failures included performance degradation, corrupted data, and lockups, all of which were difficult to debug. これで、ランタイムが終了しないケースの一覧を含む詳細については、次を参照してください。マネージ スレッドにおける例外します。For more information, including a list of cases in which the runtime does not terminate, see Exceptions in Managed Threads.

このイベントのイベント ハンドラーを登録するには、必要なアクセス許可が必要またはSecurityExceptionがスローされます。To register an event handler for this event, you must have the required permissions, or a SecurityException is thrown.

イベントの処理の詳細については、「処理とイベントの発生」を参照してください。For more information about handling events, see Handling and Raising Events.

未処理の例外の他のイベントOther Events for Unhandled Exceptions

特定のアプリケーション モデル、UnhandledExceptionイベントはメイン アプリケーション スレッドでハンドルされない例外が発生した場合、その他のイベントによって割り込まれることができます。For certain application models, the UnhandledException event can be preempted by other events if the unhandled exception occurs in the main application thread.

Windows フォームを使用するアプリケーションで未処理の例外、メイン アプリケーション スレッドが発生、Application.ThreadExceptionイベントが発生します。In applications that use Windows Forms, unhandled exceptions in the main application thread cause the Application.ThreadException event to be raised. このイベントが処理される場合、既定の動作は、未処理の例外が、アプリケーションを終了していないこと、アプリケーションが不明な状態のままですが。If this event is handled, the default behavior is that the unhandled exception does not terminate the application, although the application is left in an unknown state. その場合は、UnhandledExceptionイベントは発生しません。In that case, the UnhandledException event is not raised. アプリケーション構成ファイルを使用して、またはを使用して、この動作を変更できます、Application.SetUnhandledExceptionModeするモードを変更するメソッドをUnhandledExceptionMode.ThrowExceptionする前に、ThreadExceptionイベント ハンドラーをフックします。This behavior can be changed by using the application configuration file, or by using the Application.SetUnhandledExceptionMode method to change the mode to UnhandledExceptionMode.ThrowException before the ThreadException event handler is hooked up. これは、メイン アプリケーション スレッドにのみ適用されます。This applies only to the main application thread. UnhandledExceptionの他のスレッドでスローされた未処理の例外イベントが発生します。The UnhandledException event is raised for unhandled exceptions thrown in other threads.

Microsoft Visual Studio 2005 以降では、Visual Basic のアプリケーション フレームワークは、メイン アプリケーション スレッドでハンドルされない例外の別のイベントを提供します。Starting with Microsoft Visual Studio 2005, the Visual Basic application framework provides another event for unhandled exceptions in the main application thread. 参照してください、WindowsFormsApplicationBase.UnhandledExceptionイベント。See the WindowsFormsApplicationBase.UnhandledException event. このイベントがイベント引数オブジェクトによって使用されるイベント引数オブジェクトと同じ名前でAppDomain.UnhandledExceptionがさまざまなプロパティを使用します。This event has an event arguments object with the same name as the event arguments object used by AppDomain.UnhandledException, but with different properties. 特に、このイベント引数オブジェクトは、ExitApplicationプロパティにより、実行、未処理の例外は無視されます (および、アプリケーションが不明な状態のままになります) を継続するアプリケーションです。In particular, this event arguments object has an ExitApplication property that allows the application to continue running, ignoring the unhandled exception (and leaving the application in an unknown state). その場合は、AppDomain.UnhandledExceptionイベントは発生しません。In that case, the AppDomain.UnhandledException event is not raised.

セキュリティ

SecurityCriticalAttribute
直前の呼び出し元に対する完全な信頼が必要です。 requires full trust for the immediate caller. このメンバーは、部分的に信頼されたまたは透過的なコードで使用することはできません。 This member cannot be used by partially trusted or transparent code.

適用対象