다음을 통해 공유


AppDomain.UnhandledException 이벤트

예외가 catch되지 않으면 발생합니다.

네임스페이스: 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) sealed;
    void remove (UnhandledExceptionEventHandler^ value) sealed;
}
/** @event */
public final void add_UnhandledException (UnhandledExceptionEventHandler value)

/** @event */
public final void remove_UnhandledException (UnhandledExceptionEventHandler value)
JScript에서는 이벤트를 사용할 수 있지만 새로 선언할 수는 없습니다.

설명

이 이벤트는 catch되지 않은 예외를 알립니다. 이에 따라 시스템 기본 처리기가 사용자에게 예외를 보고하고 응용 프로그램을 종료하기 전에 응용 프로그램에서 예외에 대한 정보를 기록할 수 있습니다. 응용 프로그램의 상태에 대한 충분한 정보를 사용할 수 있는 경우 나중에 복구하기 위해 프로그램 데이터를 저장하는 등의 작업을 수행할 수 있습니다. 예외를 처리하지 않으면 프로그램 데이터가 영구적으로 손상될 수 있으므로 주의해야 합니다.

참고

.NET Framework 버전 1.0 및 1.1에서는 이 이벤트가 발생하기 전에 응용 프로그램 종료 및 디버깅 옵션이 사용자에게 보고됩니다.

이 이벤트는 모든 응용 프로그램 도메인에서 처리될 수 있습니다. 이 이벤트가 기본 응용 프로그램 도메인에서 처리되는 경우 모든 응용 프로그램 도메인의 처리되지 않은 모든 예외에 대해 이 이벤트가 발생하고, 이 이벤트가 자식 도메인에서 처리되는 경우에는 해당 도메인의 처리되지 않은 예외에 대해서만 이 이벤트가 발생합니다. 이 이벤트가 기본 도메인과 자식 도메인에서 처리되는 경우 자식 도메인에서 처리되지 않은 예외가 발생하면 두 도메인에서 모두 이 이벤트가 발생합니다.

참고

.NET Framework 버전 1.0 및 1.1에서 이 이벤트는 응용 프로그램이 시작될 때 시스템에서 만든 응용 프로그램 도메인에 대해서만 발생합니다. 응용 프로그램에서 추가 응용 프로그램을 만든 경우 이러한 추가 응용 프로그램 도메인에 이 이벤트의 대리자를 지정해도 적용되지 않습니다.

.NET Framework 버전 1.0 및 1.1에서는 기본 응용 프로그램 스레드가 아닌 다른 스레드에서 발생한 처리되지 않은 예외는 런타임에서 catch되므로 응용 프로그램이 종료되지 않습니다. 따라서 UnhandledException 이벤트가 응용 프로그램을 종료시키지 않고 발생할 수 있습니다. .NET Framework 버전 2.0에서는 자식 스레드에서 처리되지 않은 예외를 이러한 방식으로 계속 처리할 경우 성능이 저하되고 데이터가 손상되며 잠금이 발생하고 이 모든 현상을 디버깅하기가 어렵기 때문에 이러한 방식으로 처리하지 않습니다. 자세한 내용은 관리되는 스레드의 예외를 참조하십시오.

이 이벤트에 대한 이벤트 처리기를 등록하려면 필요한 사용 권한이 있어야 합니다. 그렇지 않으면 SecurityException이 throw됩니다.

이벤트 처리에 대한 자세한 내용은 이벤트 사용을 참조하십시오.

예제

다음 샘플에서는 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();
}

.NET Framework 보안

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0에서 지원

참고 항목

참조

AppDomain 클래스
AppDomain 멤버
System 네임스페이스