[아이템73] 추상화 수준에 맞는 예외를 던져라

2024. 12. 5. 00:15·1️⃣ 백앤드/이펙티브 자바

1.  예외 번역

메서드가 저수준 예외를 처리하지 않고, 무작정 바깥으로 전파해버릴 때가 있다. 이 때, 상위 메서드를 관리하는 개발자는 당황스러울 것이다. 의도치 않은 예외를 마주하기 때문이다. 이 문제를 피하기 위해선, 상위 계층에서 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다. 이를 예외 번역이라 한다.

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

저수준 레벨의 에러를 잡아 추상화 수준에 맞게 에러를 번역할 수 있게 되는 것이다. 실제 예시를 살펴보자. AbstractSequentialList 클래스에서 수행한 예외 번역을 살펴보자.

public abstract class AbstractSequentialList<E> extends AbstractList<E> {


    /**
     * Returns the element at the specified position in this list.
     *
     * @param index index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException if the index is out of range
     *         (index < 0 || index >= size())
     */
    public E get(int index) {
        try {
            return listIterator(index).next();
        } catch (NoSuchElementException e) {
            throw new IndexOutOfBoundsException("Index: " + index);
        }
    }
}

listIterator(index).next() 메서드는 NoSuchElementException을 던질 가능성이 있다.  NoSuchElementException을 그대로 사용자에게 노출하지 않고, 더 의미 있는 고수준 예외인 IndexOutOfBoundsException으로 변환한다. API 사용자 관점에서 보면 IndexOutOfBoundsException은 "인덱스 범위가 벗어났다"는 명확한 메시지를 받으므로, 저수준의 예외(NoSuchElementException)보다 더 적합하게 된다.

 

2.  예외 연쇄

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

try{
   ...
} catch(LowerLevelException cause){
   thow new HigherLevelException(cause);
}

저수준 예외의 원인을 고수준 예외 (HighLevelException) 에 원인으로 실어보내는 예외 연쇄 예시이다. 디버깅에 도움이 될 것이다.

 

3.  정리

우선, 무턱대고 예외를 전파하여 고수준 레벨에서 예외를 번역하도록 하지 말자. 우수한 방법이긴 하지만, 남용해선 곤란하다. 가능하면 저수준 메서드가 반드시 성공하도록 구현하여 예외가 발생하지 않도록 하고, 이를 피할 수 없다면 클라이언트에게 에러를 내뱉는 대신 조용히 적절한 로그를 기록해 추가 조치를 취하도록 할 수도 있다.

예외를 무작정 뱉기 전에 한번 더 생각해보자.

'1️⃣ 백앤드 > 이펙티브 자바' 카테고리의 다른 글

[아이템75] 예외의 상세 메시지에 실패 관련 정보를 담으라  (1) 2024.12.10
[아이템74] 메서드가 던지는 모든 예외를 문서화해라  (1) 2024.12.05
[아이템72] 표준 예외를 사용하라  (0) 2024.12.03
[아이템71] 필요 없는 검사 예외 사용은 피해라  (0) 2024.12.03
[아이템70] 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라  (0) 2024.12.02
'1️⃣ 백앤드/이펙티브 자바' 카테고리의 다른 글
  • [아이템75] 예외의 상세 메시지에 실패 관련 정보를 담으라
  • [아이템74] 메서드가 던지는 모든 예외를 문서화해라
  • [아이템72] 표준 예외를 사용하라
  • [아이템71] 필요 없는 검사 예외 사용은 피해라
HOZINU
HOZINU
주니어 백앤드 개발자의 세상만사 이모저모. 주로 개발 이야기를 다룸.
  • HOZINU
    백엔드 탐험 일지
    HOZINU
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • ⛪ HOME
    • 🌍 GITHUB
    • 카테고리 (73)
      • 1️⃣ 백앤드 (72)
        • 이펙티브 자바 (72)
      • 2️⃣ CS (0)
        • 운영체제 (0)
        • 네트워크 기초 (0)
        • 네트워크 응용 (0)
        • SSL & PKI (0)
        • 기타 (0)
      • 3️⃣ 코딩테스트 (0)
      • 4️⃣ 개인공부 (0)
        • MSA (0)
        • REDIS (0)
      • 5️⃣ 일상이야기 (1)
  • 인기 글

  • 태그

    로타입
    멤버클래스
    맥북
    optional
    try-with-resources
    Comparable
    의존객체
    계층구조
    정보은닉
    hashcode
    캡슐화
    빌더
    정적 팩터리 메서드
    싱글턴
    Cleaner
    표준예외
    컴포지션
    finalizer
    CLONE
    equals
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
HOZINU
[아이템73] 추상화 수준에 맞는 예외를 던져라
상단으로

티스토리툴바