뇌를 자극하는 C# 4.0 프로그래밍/ 예외 처리하기

예외에 대하여

  • 예외가 발생했을 때 코드 내에 이를 처리하는 구문이 없다면 최종적으로 CLR에게 예외가 던져지게 된다. CLR은 자신에게 던져진 예외를 “처리되지 않은 예외”로 보고 이것을 사용자에게 출력한 뒤 프로그램을 강제로 종료시켜 버린다.
  • 그러므로 프로그래머는 예외가 자신이 작성한 코드 내에서 처리 되도록 조치를 취해야 한다.

try~catch로 예외 받기

// try~catch를 이용하여 예외를 처리하는 방법
try
{
    // 실행 코드
    // 예외가 발생할 가능성이 있는 코드를 try 감싼다.
}
catch( 예외객체1 )
{
    // 예외가 발생했을 때의 처리
}
catch( 예외객체2 )
{
    // 예외가 발생했을 때의 처리
}
  • try 안에 있는 코드에서 예외가 발생하면 catch가 받아내여 예외를 처리한다.
  • 이때 catch 절은 try 블록에서 던질 예외 객체와 형식이 일치해야 하는데, 그렇지 않으면 던져진 예외를 아무도 받지 못해서 “처리되지 않은 예외”로 남게 된다.
  • 만일 try 블록에서 발생하는 예외가 여러 종류라면 catch 블록도 여러개를 둘 수 있다.

System.Exception 클래스

  • System.Exception 클래스는 모든 예외의 조상이기 때문에 System.Exception을 받는 예외절 하나면 모든 예외를 다 받아낼 수 있다.
  • 다만 System.Exception 형식은 프로그래머가 발생할 것으로 계산한 예외 이상을 받아내기 때문에 상위코드에서 처리해야 할 예외를 받아낼 수도 있으니 주의해서 사용해야 한다.

예외 던지기

// throw로 예외 던지는 방법
try
{
    throw new Exception("예외를 던집니다");
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
}

// throw로 예외 던지는 예시
static void DoSomething(int arg)
{
    if ( arg < 10 )
    {
        Console.WriteLine("arg: {0}", arg);
    }
    else
    {
        throw new Exception("arg가 10보다 큽니다");
    }
}

static void Main()
{
    try
    {
        DoSomething(12);
    }
    catch(Exception e)
    {
        Console.WriteLine(e.Message);
    }
}
  • 예외를 던지는 throw 구문이 있는 블록을 try로 감싼다고 생각하면 된다. 거기서 나오는 예외를 catch에서 받아서 처리하게 됨.

try~catch와 finally

// finally 사용 예시
try
{
    db.Open(); // 데이터베이스 커넥션
}
catch (Exception e)
{
    // 예외처리
}
finally
{
    db.Close(); // 예외가 발생하여 미처 해제하지 못한 자원은 finally에서 하면 안전하다.
}
  • try 블록에서 예외가 던져지면 프로그램은 catch 절로 점프하게 되는데, 만약 예외처리 때문에 try 블록에서 할당한 자원을 해제를 하지 않은 경우 버그가 원인이 된다.
  • finally는 자신이 붙어 있는 try절이 실행되면 반드시 실행되는 절이기 때문에 자원 해제와 같은 뒷마무리 코드는 finally 절을 이용하면 된다.
    • 예외를 throw한 경우 외에도 예외가 발생하지 않고 정상적으로 마무리 되더라도 finally는 실행된다.

사용자 정의 예외 클래스 만들기

  • Exception 클래스를 상속하기만 하면 사용자 정의 예외 클래스를 만들 수 있다.
  • (실제 클래스 만드는 내용 생략)

예외 처리 다시 생각해 보기

  • 예외처리의 장점
    1. try-catch 문을 이용한 예외 처리는 실제 일을 하는 코드와 문제를 처리하는 코드를 분리함으로써 코드를 간결하게 만들어 준다. 코드 작성과 가독성이 모두 좋다.
    2. 예외 객체의 StackTrace 프로퍼티를 통해 문제가 발생한 부분의 소스 코드 위치를 알려 주기 때문에 디버깅이 용이하다.
    3. 여러 문제점을 하나로 묶어내거나 코드에서 발생할 수 있는 오류를 종류별로 정리해 주는 효과가 있다. 예컨대 DivideZeroException 예외를 일으킬 수 있는 부분이 둘 이상일 수 있는데 이 형식의 예외를 받는 catch 블록 하나면 모두 처리할 수 있다.
It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기