Application.ThreadException과 AppDomain.CurrentDomain.UnhandledException의 차이점은 무엇입니까?


107

좋습니다. 이것은 쉬운 일입니다.

  • Application.ThreadException과 의 차이점은 무엇입니까
    AppDomain.CurrentDomain.UnhandledException?

  • 둘 다 처리해야합니까?

감사!

답변:


98

Application.ThreadException은 Windows Forms에만 해당됩니다. Winforms는 Windows에서 보낸 메시지에 대한 응답으로 이벤트 처리기를 실행합니다. 예를 들어 Click 이벤트는 당신이 알고 있다고 확신합니다. 이러한 이벤트 처리기가 예외를 throw하면 해당 예외를 포착하는 Winforms 메시지 루프 내부에 백스톱이 있습니다.

이 백스톱은 Application.ThreadException 이벤트를 발생시킵니다 . 재정의하지 않으면 사용자는 ThreadExceptionDialog 를 얻습니다 . 이를 통해 예외를 무시하고 프로그램을 계속 실행할 수 있습니다. 좋은 생각이 아닙니다.

Program.cs의 Main () 메서드에서 Application.SetUnhandledExceptionMode () 를 호출하여이 동작을 비활성화 할 수 있습니다 . 백스톱이 없으면 스레드가 처리되지 않은 예외로 인해 죽을 때 일반적인 일이 발생합니다. AppDomain.UnhandledException이 발생하고 프로그램이 종료됩니다.

Fwiw : "ThreadException"은 매우 좋지 않은 이름 선택이었습니다. 스레드와는 관련이 없습니다.


그리고 WinForms 응용 프로그램이 Application.ThreadException. 작은 C # 코드로 [여기 ]에 대한 질문을 제기했습니다 .
Mahesha999 2014

2
winforms가 단일 스레드에 바인딩되어 있기 때문에 항상 응용 프로그램 스레드 예외로 읽습니다.
Gusdor

36

에서 소스 :

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

시작 비주얼 스튜디오 2005Visual Basic에서 응용 프로그램 프레임 워크는 기본 응용 프로그램 스레드에서 처리되지 않은 예외에 대한 다른 이벤트를 제공합니다 - WindowsFormsApplicationBase.UnhandledException. 이 이벤트에는 AppDomain.UnhandledException에서 사용하는 이벤트 인수 개체와 이름이 같지만 속성이 다른 이벤트 인수 개체가 있습니다. 특히이 이벤트 인수 개체에는 ExitApplication처리되지 않은 예외를 무시하고 응용 프로그램을 알 수없는 상태로 두면서 응용 프로그램이 계속 실행될 수 있도록 하는 속성이 있습니다. 이 경우 AppDomain.UnhandledException 이벤트가 발생하지 않습니다.

Application.ThreadException잡을 수 있고 응용 프로그램이 계속 될 수 있습니다 (일반적으로 좋은 생각은 아니지만 주기적으로 실행하는 것과 같은 응용 프로그램의 경우 좋은 해결책입니다).

Windows Forms에서 만들고 소유하지 않은 스레드에서 발생하는 예외를 포착하려면 AppDomain.UnhandledException. 시스템 기본 처리기가 사용자에게 예외를보고하고 응용 프로그램을 종료하기 전에 응용 프로그램에서 예외에 대한 정보를 기록 할 수 있습니다.
이 예외를 처리한다고해서 응용 프로그램이 종료되는 것은 아닙니다.
수행 할 수있는 최대 값 (예외가 처리되지 않으면 프로그램 데이터가 손상 될 수 있음)은 나중에 복구하기 위해 프로그램 데이터를 저장하는 것입니다. 그 후 애플리케이션 도메인이 언로드되고 애플리케이션이 종료됩니다.

.NET 4 부터는 이벤트 처리기가 보안에 중요하고 HandleProcessCorruptedStateExceptionsAttribute 특성 이없는 경우 스택 오버플로 또는 액세스 위반과 같이 프로세스 상태를 손상시키는 예외에 대해이 이벤트가 발생하지 않습니다 .

자세한 내용은 MSDN을 참조하십시오 .


18

좋아-나는 그것을 내 앞에서 가지고 있었다. msdn 의이 코드 는 꽤 자명하다.

public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new 
        ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms 
    // errors to go through our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

3
이것은 그가 말할 때 serhio의 다른 대답과 대조적입니다. UnhandledExceptionMode.ThrowException은 ThreadException 이벤트 핸들러가 연결되기 전에 설정되어야합니다. 순서는 정말로 중요한 확실하지 경우 ...
다비드 Piras

@DavidePiras 예, 더 어두운 것이 있습니다. SetUnhandledException은 제 경우에는 아무런 차이가없는 것 같습니다.
nawfal 2014 년

0

그럼 점은 있습니다 ThreadException인해 스레드에 문제는 발생 Unhandled Exception하면 코드가 처리되지 않은 예외가 발생하는 경우 발생합니다.

두 번째 문제를 일으키는 쉬운 방법은 try ... catch 블록없이 앱을 만들고 예외를 throw하는 것입니다.

이제 보험이 필요하면 둘 다 처리 할 수 ​​있지만 exceptions올바르게 캡처하고 처리 하면 UnhandledException처리기 가 필요하지 않습니다 .


경우 수 없습니다 보인다 - 감사 - 처리 UnhandledException 나는 또한 ThreadException를 잡을 것인지 나도 분명 약이 아닌 무엇이었다
JohnIdol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.