[C#] 11.2 예외 클래스

C#에서 throw 뒤에 올 수 있는 형식은 반드시 Exceptaion 형식 개체이거나 Exceptaion 형식을 기반으로 파생한 형식 개체여야 합니다.

이와 같은 문법적 제약은 개발자가 프로그래밍하기 어렵게 만들기 보다는 오히려 논리적 버그를 잡는데 도움을 줍니다. Exception 클래스에는 예외 발생 이유를 나타내는 메시지와 예외 발생 소스, 예외 발생한 위치의 코드를 수행하기까지의 스택 역추적 정보를 제공합니다.

따라서 개발자가 Exception 클래스를 기반으로 예외 클래스를 정의하면 기반 형식인 Exception 클래스에서 제공하는 정보를 별도의 구현없이 제공할 수 있습니다.

static void Main(string[] args)
{
    try
    {
        Demo demo = new Demo(10);
        demo[2] = 4;
        demo[10] = 8; //유효하지 않은 인덱스 사용
    }
    catch (Exception e)
    {
        Console.WriteLine("예외 발생:{0}", e.Message);
        Console.WriteLine("소스:{0}", e.Source);
        Console.WriteLine("스택 추적 정보:{0}", e.StackTrace);
        Console.WriteLine("예외 발생 위치:{0}", e.TargetSite);
    }
    Console.WriteLine("Hello World");
}

▶ 실행 결과

예외 발생: index가 유효하지 않습니다.
소스: Exception 클래스에서 제공하는 정보
스택 추적 정보: 위치: Exception_클래스에서_제공하는_정보.Demo.set_Item
    (Int32 index, Int32 value) 파일 C:\CS\소스\11장\예외처리\Exception 
    클래스에서 제공하는 정보\Program.cs: 줄 25
    위치: Exception_클래스에서_제공하는_정보.Program.Main(String[] args) 
    파일 C:\CS\소스\11장\예외처리\Exception 클래스에서 제공하는 정보\Program.cs: 줄 43
예외 발생 위치: Void set_Item(Int32, Int32)
Hello World

실행 결과를 보면 Exception 클래스의 멤버 속성 Message에는 예외 이유를 제공함을 알 수 있습니다. 그리고 멤버 속성 Source에서는 예외가 발생한 어셈블리를 알 수 있고 StackTrace로 예외가 발생한 경로를 알 수 있습니다. 여기에서는 Main 메서드에서 set_Item(인덱서의 set블록)을 호출하였음을 알 수 있습니다. 그리고 TargetSite에서는 예외가 발생한 메서드를 알 수 있습니다.

C# 언어로 프로그래밍하다 예외가 발생하면 바로 닫지 마시고 발생한 이유와 발생한 경로 및 발생 위치를 확인하는 습관을 갖는다면 논리적 버그를 적은 비용으로 해결할 수 있습니다.

Exceptaion 클래스에서 파생한 예외 클래스는 크게 SystemException 클래스와 ApplicationException으로 나눌 수 있습니다. 이 둘은 특별히 다른 역할을 하는 것은 아니며 시스템에서 발생한 것인지 응용에서 발생한 것인지를 구분하기 위함입니다.