• 저수준 예외를 제대로 처리 하지 않으면 수행하려는 일과 관련 없는 예외가 터지기도 한다.
  • 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다.
    • 이를 예외 번역이라 한다.
// 예외번역

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

/**
* 이 리스트 안의 지정한 위치의 원소를 반환한다.
* @throw IndexOutOfBoundsException index가 범위 밖이라면,
*     즉 ({@code index < 0 || index >= size()})이면 발생한다.
*/

public E get(int index) {
    ListIterator<E> i = listIterator(index);
    try {
        return i.next();
    } catch (NoSuchElementException e) {
        throw new IndexOutOfBoundsException("인덱스: " + index);
    }
} 
  • NoSuchElementException을 IndexOutOfBoundsException으로 교체해줌

 

 

예외 연쇄

  • 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보내는 방식
  • 별도의 접근자 메소드(Throwable의 getCause 메소드)를 통해 필요하면 언제든 저수준 예외를 꺼내볼 수 있음
// 예외 연쇄

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

 

 

무턱대고 예외를 전파하는 것보단 예외 번역이 낫지만 남용해서는 안된다.

  • 가능하다면 저수준 메소드가 반드시 성공하도록하라 (예외 발생이 안되는게 최선이다.)
  • 상위 계층에서 logging을 사용해서 처리하는 것도 방법이다.

+ Recent posts