본문 바로가기

IT 살이/04. 기술 - 프로그래밍

CLR의 Global 예외처리

애플리케이션단에서 처리되지 않은 예외를 CLR에서 처리하는 방식이 .NET의 버전에 따라서 약간 다르다. 참조 문서는 v1.1과 v2.0에서의 Global 예외 처리를 비교하고 있다.

"CLR의 Global 예외처리"라는 것은 달봉이가 사용하는 용어로서, .NET 애플리케이션에서 처리하지 못하고 결국은 CLR까지 전달되어온 예외를 처리하는 방식을 말하고 있다.

v1.1의 방식은 문서를 참고하고, v2.0을 기준으로 해서 요약하겠다. 처리되지 않은 예외가 전파될때 최종적으로 작동하는 예외 처리기는 애플리케이션의 타입에 따라 다르다.


■ Windows Forms 애플리케이션이 아닌 경우

최종 예외 처리기  : AppDomain.UnhandledException 처리기
사용 예
AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs e)  
{
    //이곳에서 예외 처리한다.
     Console.WriteLine( "예외발생했씸더~~");
};


■ Windows Forms 애플리케이션인 경우

최종 예외 처리기 : Application.ThreadException 처리기
사용예
void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  //이곳에서 예외 처리한다.

  try
  {
     // Call user override
     if (this.threadExceptionHandler != null)
     {
        this.threadExceptionHandler(Thread.CurrentThread, new ThreadExceptionEventArgs(e.Exception));
     }
     else
     {
        using (ThreadExceptionDialog excptDlg = new ThreadExceptionDialog(e.Exception))
        {
           DialogResult result = excptDlg.ShowDialog();
           if (result == DialogResult.Abort)
              Application.Exit();
        }
     }
  }
  catch
  {
  }
}


Windows Forms 애플리케이션에서 처리되지 않은 예외중에서 Primary 쓰레드에서 발생한 예외는 Application.ThreadException 처리기로 보내진다. 그러나 만약 Secondary 쓰레드에서 예외가 발생하면 AppDomain.UnhandledException으로 보내지게 된다.

애플리케이션 타입에 따라 이렇게 예외 핸들링을 해야 하는 것이 불편하다면 다음과 같은 방법을 사용해서 AppDomain.UnhandledException 에서 일괄적으로 처리할 수 있다.

■  모든 애플리케이션에서 AppDomain.UnhandledException 사용하기

[STAThread]
static void Main()
{
  Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
  Application.Run(new Form1());
}

Windows Forms 애플리케이션에서 Application.SetUnhandledExceptionMode()에서 이렇게 UnhandledExceptionMode.ThrowException 설정을 하면, 예외를 Application.ThreadException 처리기로 보내지 않고 다시 throw시킨다. 결국 AppDomain의 UnhandledException 처리기가 받게 된다.

참조 문서

Handling "Unhandled Exceptions" in .NET 2.0