Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
수행하려는 일과 관련 없어 보이는 예외가 튀어나오면
- 프로그래머 당황
- 내부 구현 방식을 드러내어 윗 레벨 API 오염시킴
- 다음 릴리스에서 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트 프로그램 깨짐

이 문제를 피하려면 **예외 번역**을 해야 한다.
- 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던짐

<br>

예외를 번역할 때, 저수준 예외가 디버깅에 도움이 된다면 **예외 연쇄**를 사용하는 게 좋다.
- 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보냄
- 별도의 접근자 메서드(Throwable의 getCause 메서드)를 통해 저수준 예외를 꺼내볼 수 있음
- 대부분의 표준 예외는 예외 연쇄용 생성자를 갖추고 있음
- 그렇지 않은 예외라도 Throwable의 initCause 메서드를 이용해 '원인'을 직접 못박을 수 있음

<br>

무턱대고 예외를 전파하는 것보다야 예외 번역이 우수한 방법이지만, 그렇다고 남용해서는 곤란하다.
- 최선) 저수준 메서드가 반드시 성공하도록 하여 아래 계층에서는 예외가 발생하지 않도록 함
- 상위 계층 메서드의 매개변수 값을 아래 계층 메서드로 건네기 전에 미리 검사하는 방법 있음
- 차선) 상위 계층에서 아래 계층의 예외를 조용히 처리하여 문제를 API 호출자에까지 전파하지 않도록 함
- 발생한 예외는 java.util.logging 같은 적절한 로깅 기능을 활용하여 기록해두면 좋음