Skip to content
This repository was archived by the owner on Sep 2, 2023. It is now read-only.

Latest commit

 

History

History
33 lines (22 loc) · 1.86 KB

File metadata and controls

33 lines (22 loc) · 1.86 KB

아이템 73. 추상화 수준에 맞는 예외를 던지라

메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 종종 일어나는 일이다. 내부 구현 방식을 드러내 윗 레벨 API를 오염시킨다.

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

try{
  ...//저수준 추상화를 이용한다. 
}catch (LowerLevelException e){
  // 추상화 수준에 맞게 번역한다. 
  throw new HigherLevelException(..);
}

예외를 번역할 때 저수준 예외가 디버깅에 도움이 된다면 예외 연쇄(exception chaining)를 사용하는게 좋다. 예외 연쇄란 문제의 근본원인(cause)인 저수준 예외를 고수준 예외에 실어 보내는 방식이다. 그러면 별도의 접근자 메서드(Throwable의 getCause 메서드)를 통해 필요하면 언제든 저수준 예외를 꺼내 볼 수 있다.

try{
  ...//저수준 추상화를 이용한다. 
}catch (LowerLevelException cause){
  // 저수준 예외를 고수준 예외에 실어 보낸다. 
  throw new HigherLevelException(cause);
}

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

무턱대고 예외를 전파하는 것보다야 예외 번역이 우수한 방법이지만, 그렇다고 남용해서는 곤란하다. 가능하다면 저수준 메서드가 반드시 성공하도록 하여 아래 계층에서는 예외가 발생하지 않도록 하는 것이 최선이다. 때론 상위 계층 메서드의 매개변수 값을 아래 꼐층 메서드로 건네기 전에 미리 검사하는 방법으로 이 목적을 달성할 수 있다.