답변:
Application.ThreadException은 Windows Forms에만 해당됩니다. Winforms는 Windows에서 보낸 메시지에 대한 응답으로 이벤트 처리기를 실행합니다. 예를 들어 Click 이벤트는 당신이 알고 있다고 확신합니다. 이러한 이벤트 처리기가 예외를 throw하면 해당 예외를 포착하는 Winforms 메시지 루프 내부에 백스톱이 있습니다.
이 백스톱은 Application.ThreadException 이벤트를 발생시킵니다 . 재정의하지 않으면 사용자는 ThreadExceptionDialog 를 얻습니다 . 이를 통해 예외를 무시하고 프로그램을 계속 실행할 수 있습니다. 좋은 생각이 아닙니다.
Program.cs의 Main () 메서드에서 Application.SetUnhandledExceptionMode () 를 호출하여이 동작을 비활성화 할 수 있습니다 . 백스톱이 없으면 스레드가 처리되지 않은 예외로 인해 죽을 때 일반적인 일이 발생합니다. AppDomain.UnhandledException이 발생하고 프로그램이 종료됩니다.
Fwiw : "ThreadException"은 매우 좋지 않은 이름 선택이었습니다. 스레드와는 관련이 없습니다.
에서 소스 :
Windows Forms를 사용하는 응용 프로그램에서 주 응용 프로그램 스레드의 처리되지 않은 예외로 인해
Application.ThreadException
이벤트가 발생합니다. 이 이벤트가 처리되는 경우 기본 동작은 응용 프로그램이 알 수없는 상태로 남아 있어도 처리되지 않은 예외가 응용 프로그램을 종료하지 않는 것입니다. 이 경우UnhandledException
이벤트가 발생하지 않습니다. 이 동작은 응용 프로그램 구성 파일을 사용하거나 이벤트 처리기가 연결 되기 전에Application.SetUnhandledExceptionMode
모드를 변경하는 메서드를 사용하여 변경할 수 있습니다. 이것은 메인 애플리케이션 스레드에만 적용됩니다. 이벤트는 다른 스레드에 던져 처리되지 않은 예외를 발생합니다.UnhandledExceptionMode.ThrowException
ThreadException
UnhandledException
시작 비주얼 스튜디오 2005 는 Visual Basic에서 응용 프로그램 프레임 워크는 기본 응용 프로그램 스레드에서 처리되지 않은 예외에 대한 다른 이벤트를 제공합니다 -
WindowsFormsApplicationBase.UnhandledException
. 이 이벤트에는 AppDomain.UnhandledException에서 사용하는 이벤트 인수 개체와 이름이 같지만 속성이 다른 이벤트 인수 개체가 있습니다. 특히이 이벤트 인수 개체에는ExitApplication
처리되지 않은 예외를 무시하고 응용 프로그램을 알 수없는 상태로 두면서 응용 프로그램이 계속 실행될 수 있도록 하는 속성이 있습니다. 이 경우 AppDomain.UnhandledException 이벤트가 발생하지 않습니다.
Application.ThreadException
잡을 수 있고 응용 프로그램이 계속 될 수 있습니다 (일반적으로 좋은 생각은 아니지만 주기적으로 실행하는 것과 같은 응용 프로그램의 경우 좋은 해결책입니다).
Windows Forms에서 만들고 소유하지 않은 스레드에서 발생하는 예외를 포착하려면 AppDomain.UnhandledException
. 시스템 기본 처리기가 사용자에게 예외를보고하고 응용 프로그램을 종료하기 전에 응용 프로그램에서 예외에 대한 정보를 기록 할 수 있습니다.
이 예외를 처리한다고해서 응용 프로그램이 종료되는 것은 아닙니다.
수행 할 수있는 최대 값 (예외가 처리되지 않으면 프로그램 데이터가 손상 될 수 있음)은 나중에 복구하기 위해 프로그램 데이터를 저장하는 것입니다. 그 후 애플리케이션 도메인이 언로드되고 애플리케이션이 종료됩니다.
.NET 4 부터는 이벤트 처리기가 보안에 중요하고
HandleProcessCorruptedStateExceptionsAttribute
특성 이없는 경우 스택 오버플로 또는 액세스 위반과 같이 프로세스 상태를 손상시키는 예외에 대해이 이벤트가 발생하지 않습니다 .
자세한 내용은 MSDN을 참조하십시오 .
좋아-나는 그것을 내 앞에서 가지고 있었다. 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());
}
그럼 점은 있습니다 ThreadException
인해 스레드에 문제는 발생 Unhandled Exception
하면 코드가 처리되지 않은 예외가 발생하는 경우 발생합니다.
두 번째 문제를 일으키는 쉬운 방법은 try ... catch 블록없이 앱을 만들고 예외를 throw하는 것입니다.
이제 보험이 필요하면 둘 다 처리 할 수 있지만 exceptions
올바르게 캡처하고 처리 하면 UnhandledException
처리기 가 필요하지 않습니다 .
Application.ThreadException
. 작은 C # 코드로 [여기 ]에 대한 질문을 제기했습니다 .