WPF에서 처리되지 않은 예외 캡처

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)
	{
		// 로그 등 예외 처리
	}
}

주의사항

  • 예외 처리기 내에서 또 다른 예외가 발생하지 않도록 예외 처리를 철저히 해야 합니다.
  • 사용자에게 오류 메시지를 표시하거나 애플리케이션을 안전하게 종료하는 로직을 추가할 수 있습니다.