다음을 통해 공유


System.AppDomain.UnhandledException 이벤트

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

UnhandledException 이벤트는 처리되지 않은 예외에 대한 알림을 제공합니다. 애플리케이션은 시스템 기본 처리기가 사용자에게 예외를 보고하고 애플리케이션을 종료하기 전에 예외에 대한 정보를 기록할 수 있습니다. 애플리케이션 상태에 대한 충분한 정보를 사용할 수 있는 경우 나중에 복구할 수 있도록 프로그램 데이터를 저장하는 등의 다른 작업이 수행될 수 있습니다. 예외가 처리되지 않을 때 프로그램 데이터가 손상될 수 있으므로 주의해야 합니다. 또한 예외가 발생했을 때 잠금 상태를 유지한 채로 처리기가 실행되므로, 교착 상태가 발생할 수 있는 다른 리소스를 기다리게 되는 것을 방지해야 합니다.

모든 애플리케이션 도메인에서이 이벤트를 처리할 수 있습니다. 그러나 예외가 발생한 응용 프로그램 도메인에서 이벤트가 반드시 발생하는 것은 아닙니다. 스레드의 전체 스택이 적절한 예외 처리기를 찾지 못한 채 정리된 경우에만 예외가 처리되지 않습니다. 따라서 이벤트가 발생할 수 있는 첫 번째 위치는 스레드가 시작된 애플리케이션 도메인입니다.

UnhandledException 이벤트가 기본 애플리케이션 도메인에서 처리되는 경우, 스레드가 시작된 애플리케이션 도메인과 관계없이 어떤 스레드에서든 처리되지 않은 예외가 발생하면 해당 도메인에서 예외가 처리됩니다. 애플리케이션 도메인에 UnhandledException에 대한 이벤트 처리기가 있고, 이 도메인에서 스레드가 시작된 경우 해당 애플리케이션 도메인에서 이벤트가 발생합니다. 그 애플리케이션 도메인이 기본 애플리케이션 도메인이 아닌 경우, 기본 애플리케이션 도메인에 이벤트 처리기가 있다면, 이벤트는 양쪽 애플리케이션 도메인에서 발생합니다.

예를 들어, 스레드가 애플리케이션 도메인 "AD1"에서 시작하여 "AD2"의 메서드를 호출하고, 거기서 "AD3"의 메서드를 호출했을 때 예외를 발생시키는 상황을 가정해 봅시다. 첫 번째 애플리케이션 도메인에서 UnhandledException 이벤트가 발생할 수 있는 곳은 "AD1"입니다. 애플리케이션 도메인이 기본 애플리케이션 도메인이 아닌 경우, 이벤트는 기본 애플리케이션 도메인에서도 발생할 수 있습니다.

참고

공용 언어 런타임은 UnhandledException 이벤트에 대한 이벤트 처리기가 실행되는 동안 스레드 중단을 일시적으로 중지합니다.

이벤트 처리기에 적절한 플래그가 있는 ReliabilityContractAttribute 특성이 있는 경우 이벤트 처리기는 제한된 실행 영역으로 처리됩니다.

.NET Framework 4부터, 이벤트 처리기가 보안에 중요하고 HandleProcessCorruptedStateExceptionsAttribute 특성을 갖고 있지 않으면, 스택 오버플로나 접근 위반과 같이 프로세스의 상태를 손상시키는 예외에 대해 이 이벤트는 발생하지 않습니다.

이 이벤트에 대해 이벤트 처리기를 등록하려면 필요한 권한이 있어야 하며, 그렇지 않으면 SecurityException 예외가 발생합니다.

이벤트 처리에 대한 자세한 내용은 이벤트 처리 및 발생시키기를 참조하십시오.

처리되지 않은 예외에 대한 기타 이벤트

특정 애플리케이션 모델은 UnhandledException 이벤트 주 애플리케이션 스레드에 처리 되지 않은 예외가 발생 하는 경우 다른 이벤트에 의해 선점 될 수 있습니다.

Windows Forms를 사용하는 애플리케이션에서는 주 애플리케이션 스레드에서 처리되지 않은 예외가 발생할 때 Application.ThreadException 이벤트가 발생합니다. 이 이벤트가 처리된 경우의 기본 동작은, 처리되지 않은 예외가 애플리케이션을 종료하지 않도록 하지만, 애플리케이션은 알 수 없는 상태로 남아 있게 된다는 것입니다. 이 경우 UnhandledException 이벤트가 발생하지 않습니다. 애플리케이션 구성 파일을 사용하거나 Application.SetUnhandledExceptionMode 메소드를 사용하여 UnhandledExceptionMode.ThrowException로 모드를 변경하여 ThreadException 이벤트 처리기를 연결하기 전에 이 동작을 변경할 수 있습니다. 이 주 애플리케이션 스레드에만 적용 됩니다. 다른 스레드에서 던져진 처리되지 않은 예외에 대해 UnhandledException 이벤트가 발생합니다.

Visual Basic 애플리케이션 프레임워크는 기본 애플리케이션 스레드에서 처리되지 않은 예외에 대한 또 다른 이벤트인 WindowsFormsApplicationBase.UnhandledException 이벤트를 제공합니다. 이 이벤트에는 사용되는 이벤트 인수 개체와 이름이 같지만 속성이 다른 이벤트 인수 개체 AppDomain.UnhandledException가 있습니다. 특히, 이 이벤트 인수 객체에는 애플리케이션이 실행을 계속하면서 처리되지 않은 예외를 무시하도록 하는 ExitApplication 속성이 있으며, 이로 인해 애플리케이션이 알 수 없는 상태에 있을 수 있습니다. 이 경우 AppDomain.UnhandledException 이벤트가 발생하지 않습니다.