WPF에서 처리되지 않은 예외 캡처
WPF에서 전역 예외 처리기를 설정하여 처리되지 않은 예외에 대해 애플리케이션 종료 전에 로그로 남길 수 있습니다.
Application.DispatcherUnhandledException
이 이벤트는 UI 스레드에서 발생한 처리되지 않은 예외를 캡처합니다. App.xaml.cs
파일에서 이벤트를 구독합니다.
public partial class App : Application
{
public App()
{
this.DispatcherUnhandledException += App_DispatcherUnhandledException;
}
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// 예외를 로그로 저장
LogException(e.Exception);
// 애플리케이션 종료 방지 (필요 시)
e.Handled = true;
}
private void LogException(Exception ex)
{
// 로그 등 예외 처리
}
}
e.Handled = true;
를 설정하면 애플리케이션이 종료되지 않고 계속 실행됩니다. 필요에 따라 설정할 수 있습니다.
AppDomain.CurrentDomain.UnhandledException
이 이벤트는 UI 스레드 외의 스레드에서 발생한 예외를 캡처합니다.
public partial class App : Application
{
public App()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// 예외를 로그로 저장
Exception ex = e.ExceptionObject as Exception;
LogException(ex);
}
private void LogException(Exception ex)
{
// 로그 등 예외 처리
}
}
TaskScheduler.UnobservedTaskException
비동기 작업(Task)에서 발생하는 처리되지 않은 예외를 캡처합니다.
public partial class App : Application
{
public App()
{
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
// 예외를 로그로 저장
LogException(e.Exception);
// 예외가 관찰되었음을 표시하여 프로세스 종료를 방지
e.SetObserved();
}
private void LogException(Exception ex)
{
// 로그 등 예외 처리
}
}
주의사항
- 예외 처리기 내에서 또 다른 예외가 발생하지 않도록 예외 처리를 철저히 해야 합니다.
- 사용자에게 오류 메시지를 표시하거나 애플리케이션을 안전하게 종료하는 로직을 추가할 수 있습니다.