추상화 수준에 맞는 예외를 던져라

김종준·2023년 9월 14일
0

이펙티브자바

목록 보기
60/63

추상화 수준에 맞는 예외를 던져라

수행하려는 일과 관련 없어 보이는 예외가 튀어나오면 당황스러울 것이다.

메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해 버릴 때 종종 일어나는 일이다.

이는 프로그래머를 당황하게 하는 데 그치지 않고, 내부 구현 방식을 드러내어 윗 레벨 API를 오염시킨다.

다음 릴리스에서 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트 프로그램을 깨지게 할 수도 있다.

이 문제를 피하려면 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다.

이를 예외 번역이라 한다.

예외를 번역할 때, 저수준 예외가 디버깅에 도움이 된다면 예외 연쇄를 사용하는게 좋다.

예외 연쇄란 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보내는 방식이다.

그러면 별도의 접근자 메서드를 통해 필요하면 언제든 저수준 예외를 꺼내 볼 수 있다.

고수준 예외의 생성자는 상위 클래스의 생성자에 이 '원인'을 건네주어, 최종적으로 생성자까지 건네지게 한다.

대부분의 표준 예외는 예외 연쇄용 생성자를 갖추고 있다.

그렇지 않은 예외라도 Throwable의 initCause 메서드를 이용해 '원인'을 직접 못 박을 수 있다.

예외 연쇄는 문제의 원인을 (getCause 메서드로) 프로그램에서 접근할 수 있게 해주며, 원인과 고수준 예외의 스택 추적 정보를 잘 통합해 준다.

무턱대고 예외를 전파하는 것보다야 예외 번역이 우수한 방법이지만, 그렇다고 남용해서는 곤란하다.

0개의 댓글