Skip to content

Latest commit

 

History

History
68 lines (53 loc) · 2.35 KB

73_추상화수준에_맞는_예외를던지자.md

File metadata and controls

68 lines (53 loc) · 2.35 KB

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

  • 메서드가 저수준 예외를 처리하지 않고 바깥으로 내보낸다면
    • 사용자 입장에서 수행하려는 일과 관련 없는 예외가 발생함.
    • 내부 구현 방식을 드러내어 윗 레벨 API를 오염시킨다. 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트를 깨지게함

해결책 : 예외 번역

  • 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야한다.
try {
    ... // 저수준 추상화 이용
} catch (LowerLevelException){
    // 추상화 수준에 맞게 번역
    throw new HigherLevelException(...);
}

실제 사용 (AbstractSequentialList)

    /**
     * Returns the element at the specified position in this list.
     *
     * <p>This implementation first gets a list iterator pointing to the
     * indexed element (with {@code listIterator(index)}).  Then, it gets
     * the element using {@code ListIterator.next} and returns it.
     *
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E get(int index) {
        try {
            return listIterator(index).next();
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

예왜 연쇄

  • 예왜를 번역할때, 저수준 예외가 디버깅에 도움된다면 예외 연쇄 사용
    • 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보냄
try {
    ... // 저수준 추상화 이용
} catch (LowerLevelException cause){
    // 추상화 수준에 맞게 번역
    throw new HigherLevelException(cause);
}
  • 대부분 표준 예외는 예외 연쇄용 생성자 있음
    • 없으면 initCause메서드 사용

주의사항

  • 무턱대고 예외를 전파하는 것보다 예외 번역이 우수한 방법이지만, 그렇다고 남용하지말자.
    • 가능하다면 저수준 메서드가 반드시 성공하도록하여 아래 계층에서는 예외가 발생하지 않도록 하는것이 최선
    • 즉, 호출 전 매개변수 미리 검사하여 메서드 건내자.
  • 아래 계층에서 예외를 피할 수 없다면, 상위 계층에서 그 예외를 처리하여 API호출자에게 전파하지 않게하자.