ITEM 47 :: EFFECTIVE C#


안녕하세요, 47번째 시간입니다.


이번 챕터는 사용자 지정 예외 클래스를 완벽하게 작성하라, 입니다. 사용자 지정 예외 클래스란, 이미 만들어져 있는 예외클래스에서 무언가를 추가한 형태가 될텐데요. 이를 작성하게되면 여러 상황에 대처할 수 있게 되지만, 그렇다고 무분별하게 생성해선 안될 것 같은데, 그에 대한 내용인 것 같습니다.

설명

  1. 여러가지 예외 상황에 대해 응용프로그램 수준에서 정보를 얻고 싶다면 사용자 지정 예외 클래스를 작성하면 된다. 하지만, 중요하게 생각해봐야하는 문제가 있는데, 예외 클래스를 작성하는 이유와 계층적으로 어떤 정보를 담도록 설계해야하는지 생각해봐야 한다.

  2. 일반적으로는 catch문을 작성할 때 예외의 런타임 타입에 따라 서로 다른 작업을 수행하도록 코드를 작성한다.

  3. 즉, 예외 클래스를 개발하는 개발자의 경우 다른 예외와는 달리 별도의 조치가 필요하다고 생각되는 경우에만 추가적으로 예외 클래스를 작성하는 것이 좋다. 그렇지 않으면 쓸모없는 예외 클래스를 만드는 꼴이 된다.

  4. 또한, 예외 상황에서 어떤 예외상황이 발생했는지만 기록하는 것보다, 그 상황에 대한 다양한 정보를 받아들임으로써 면밀히 살펴보고 극복할 수 있는 오류 상황인지를 판단하여 추가 조치를 할 수 있는 것이 베스트다.

  5. 또한 모든 경우에 예외를 발생시키는 것보다, 즉각적으로 대처해야하거나, 보고되지 않았을 경우 심각한 문제를 초래하는 경우가 아니라면 예외를 발생시키지 않는 것이 좋다. 단순한 리턴코드로만 받아도 되는 수준의 예외와 이것을 무시하게 되면 더 심각한 오류를 불러올 큰 예외에 대해 구분할 줄 알아야 한다.

  6. System.Exception 예외 클래스를 너무 남용하는 것은 좋지 않다. 이는 예외에 대한 많은 정보를 주지 못한다. 혹, 그보다 많은 정보가 필요하고 복구나 조치에 대해 다른 정보가 필요할 경우에는 새로운 예외 클래스를 작성하는 것이 좋을 수 있다.

  7. 서로 다른 예외 클래스를 활용하여 예외를 발생시키는 유일한 이유는 catch문을 사용하여 예외를 다루는 코드를 작성할 개발자가 그 각각을 구분하여 서로 다른 작업을 수행할 수 있도록 해주기 위함이다. 따라소 추가적인 정보를 담도록 작성해야 제대로 된 예외 클래스를 작성할 수 있다. 또한, 해당 예외가 다른 작업이나 복구 메커니즘으로 이어질 가능성이 있다면, ㅡ 하나의 예외에서 또 다른 예외로, 그리고 그 예외는 또 다른 예외로 ㅡ 새로운 예외 클래스를 작성하는 것이 좋다.

  8. 예외 클래스를 작성할 때에는 예외클래스의 고유한 책임을 명확하게 규정해야 한다. 그리고 모든 예외 클래스의 이름은 Exception으로 끝나야 하며, System.Exception이나 혹은 더 적절한 예외 클래스를 상속해서 구현해야 한다. 베이스 클래스에 직접 기능을 추가할 일은 거의 없다고 볼 수 있다. 예외 클래스를 작성하는 이유가, Catch문 안에서 예외가 발생한 원인을 서로 구분하기 위함임을 잊으면 안된다.

  9. 또한 예외 클래스를 작성할 경우에는 4개의 생성자를 필수로 구현해야 한다. 각각 기본 생성자, 에러 메세지를 매개 변수로 받는 생성자, 에러 메세지와 내부 예외를 포함하는 생성자, 마지막으로 입력 스트림을 이용하는 생성자까지. 입력 스트림을 이용하는 생성자는 이 예외 클래스가 Serialize 가능해야 함을 의미하는 것이기도 하다. 이렇게 하면 저수준의 예외 반환에서 고수준의 정보를 가지고 있는 예외 객체를 반환받을 수 있게 된다.

결론

서로 다른 방식으로 예외를 다루는 것이 적절하다고 생각되는 오류라면 그 각각을 분리하여 독립된 예외 클래스로 작성해야 한다. 예외 클래스를 작성할 때에는 상위 클래스가 제공하는 모든 생성자를 반드시 구현해야 한다. 그리고 InnerException 속성을 이용하면 저수준에서 발생한 오류 상황 이외에도 추가적인 정보를 전달할 수 있다.