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 |