Item 73 : 추상화 수준에 맞는 예외를 던져라
2021. 9. 9. 18:38
- 저수준 예외를 제대로 처리 하지 않으면 수행하려는 일과 관련 없는 예외가 터지기도 한다.
- 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다.
- 이를 예외 번역이라 한다.
// 예외번역
try {
... // 저수준 추상화를 이용한다.
} catch (LowerLevelException e) {
// 추상화 수준에 맞게 번역한다.
throw new HigherLevelException(...);
}
// AbstractSequentialList에서 수행하는 예외 번역
/**
* 이 리스트 안의 지정한 위치의 원소를 반환한다.
* @throw IndexOutOfBoundsException index가 범위 밖이라면,
* 즉 ({@code index < 0 || index >= size()})이면 발생한다.
*/
public E get(int index) {
ListIterator<E> i = listIterator(index);
try {
return i.next();
} catch (NoSuchElementException e) {
throw new IndexOutOfBoundsException("인덱스: " + index);
}
}
- NoSuchElementException을 IndexOutOfBoundsException으로 교체해줌
예외 연쇄
- 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보내는 방식
- 별도의 접근자 메소드(Throwable의 getCause 메소드)를 통해 필요하면 언제든 저수준 예외를 꺼내볼 수 있음
// 예외 연쇄
try {
// 저수준 추상화를 사용
} catch (LowerLevelException cause) {
// 저수준 예외를 고수준 예외에 실어 보낸다.
throw new HigherLevelException(cause);
}
무턱대고 예외를 전파하는 것보단 예외 번역이 낫지만 남용해서는 안된다.
- 가능하다면 저수준 메소드가 반드시 성공하도록하라 (예외 발생이 안되는게 최선이다.)
- 상위 계층에서 logging을 사용해서 처리하는 것도 방법이다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 75 : 예외의 상세 메시지에 실패 관련 정보를 담으라 (0) | 2021.09.11 |
---|---|
Item 74 : 메소드가 던지는 모든 예외를 문서화하라 (0) | 2021.09.10 |
Item 72 : 표준 예외를 사용하라 (0) | 2021.09.08 |
Item 71 : 필요없는 검사 예외사용은 피하라 (0) | 2021.09.07 |
Item 70 : 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라. (0) | 2021.09.07 |