You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
내부 구현 방식을 드러내어 윗 레벨 API를 오염시킨다. 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트를 깨지게함
해결책 : 예외 번역
상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야한다.
try {
... // 저수준 추상화 이용
} catch (LowerLevelException){
// 추상화 수준에 맞게 번역thrownewHigherLevelException(...);
}
실제 사용 (AbstractSequentialList)
/** * Returns the element at the specified position in this list. * * <p>This implementation first gets a list iterator pointing to the * indexed element (with {@code listIterator(index)}). Then, it gets * the element using {@code ListIterator.next} and returns it. * * @throws IndexOutOfBoundsException {@inheritDoc} */publicEget(intindex) {
try {
returnlistIterator(index).next();
} catch (NoSuchElementExceptionexc) {
thrownewIndexOutOfBoundsException("Index: "+index);
}
}
예왜 연쇄
예왜를 번역할때, 저수준 예외가 디버깅에 도움된다면 예외 연쇄 사용
문제의 근본 원인인 저수준 예외를 고수준 예외에 실어 보냄
try {
... // 저수준 추상화 이용
} catch (LowerLevelExceptioncause){
// 추상화 수준에 맞게 번역thrownewHigherLevelException(cause);
}
대부분 표준 예외는 예외 연쇄용 생성자 있음
없으면 initCause메서드 사용
주의사항
무턱대고 예외를 전파하는 것보다 예외 번역이 우수한 방법이지만, 그렇다고 남용하지말자.
가능하다면 저수준 메서드가 반드시 성공하도록하여 아래 계층에서는 예외가 발생하지 않도록 하는것이 최선
즉, 호출 전 매개변수 미리 검사하여 메서드 건내자.
아래 계층에서 예외를 피할 수 없다면, 상위 계층에서 그 예외를 처리하여 API호출자에게 전파하지 않게하자.