베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • dfs
    • 이펙티브자바
    • 함수형인터페이스
    • BFS
    • Spring
    • 자바
    • 토비스프링
    • jpa
    • C++
    • leetcode
    • 데이터베이스
    • 스프링
    • 운영체제
    • 코드업
    • java
    • 알고리즘
    • 스프링시큐리티
    • 자바8
    • 스레드
    • 백준

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    개발서적/Effective Java

    [Effective Java] 추상화 수준에 맞는 예외를 던지라

    2023. 6. 6. 06:57

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

    수행하려는 일과 관련 없어 보이는 예외가 튀어나오면 당황스럽다. 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 이런 경우가 종종 발생한다. 이러한 예외는 내부 구현 방식을 드러내어 윗 레벨 API를 오염시키기까지 한다.

    예외 번역

    이러한 문제를 피하기 위해 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다. 이를 '예외 번역' 이라고 한다. 다음은 AbstractSequentialList에서 수행하는 예외 번역의 예다.

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

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

    예외 연쇄

    문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보내는 방식을 '예외 연쇄'라고 한다. 그러면 별도의 접근자 메서드(Throwable의 getCause())를 통해 필요하면 언제든 저수준 예외를 꺼내볼 수 있다.

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

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

    class HigherLevelException extends Exception {
        HigherLevelException(Throwable cause) {
            super(cause);
        }
    }

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

    저수준에서 최대한 처리하자

    무턱대고 예외를 전파하는 것보다야 예외 번역이 우수한 방법이지만, 그렇다고 남용해서는 안된다. 가능하다면 저수준 메서드가 반드시 성공하도록 하여 아래 계층에서는 예외가 발생하지 않도록 하는 것이 최선이다. 이를 위해 다음 두 가지 방법을 사용할 수 있다.

    1. 상위 계층 메서드의 매개변수 값을 아래 계층 메서드로 건네기 전에 미리 검사하자.
    2. 상위 계층에서 예외를 조용히 처리하여 문제를 API 호출까지 전파하지 않는 방법이 있다면 이를 사용하자.
      • 이 경우 발생한 예외는 java.util.logging과 같은 로깅 기능을 활용하여 기록해두면 좋다.
    저작자표시 비영리 변경금지 (새창열림)
      '개발서적/Effective Java' 카테고리의 다른 글
      • [Effective Java] 예외의 상세 메세지에 실패 관련 정보를 담으라
      • [Effective Java] 메서드가 던지는 모든 예외를 문서화하라
      • [Effective Java] 표준 예외를 사용하라
      • [Effective Java] 필요 없는 검사 예외 사용은 피하라
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바