AppDomain.UnhandledException 이벤트

정의

예외가 catch되지 않으면 발생합니다.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 following example demonstrates the UnhandledException event. 이벤트 처리기를 정의 MyHandler, 기본 애플리케이션 도메인에서 처리 되지 않은 예외가 throw 됩니다 될 때마다 호출 되는 합니다.It defines an event handler, MyHandler, that is invoked whenever an unhandled exception is thrown in the default application domain. 그런 다음 두 가지 예외를 throw 합니다.It then throws two exceptions. 첫 번째는 try/catch 블록에 의해 처리 됩니다.The first is handled by a try/catch block. 두 번째는 처리 되지 않으며 호출을 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()

설명

이 이벤트는 catch 되지 않은 예외에 대 한 알림을 제공 합니다.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"에서 예외가 throw 되 합니다.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 버전 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 throw 됩니다.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 Forms를 사용 하는 애플리케이션에서 처리 되지 않은 주 애플리케이션 스레드 원인에는 예외는 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 이벤트는 다른 스레드에서 throw 된 처리 되지 않은 예외에 대해 발생 합니다.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.

적용 대상