Java

Effective Java 제 10장 - 예외

iksadnorth 2023. 8. 22. 23:07

해당 게시물은 책 'Effective Java'를 참고하고 작성했습니다.

예외를 흐름제어와 같은 예외가 아닌 상황에서 사용하지 말라!
아래와 같이 흐름제어를 위해 if문을 대체하는 코드를 사용하지 않아야 한다.
성능적으로 손해를 많이 볼 수 있고 무엇보다도 가독성이 최악으로 치닫기 때문이다.

try {
    int i=0;
    while(true) {
        range[i++].climb();
    }
} catch (ArrayIndexOutOfBoundsException e) {}

참고로 위 코드는 아래와 같다.

for(Mountain m : range) {
    m.climb();
}

추상화 수준에 맞는 예외를 던져라!
여러 라이브러리를 조합해서 새로운 라이브러리를 만들면
수행하려는 일과는 상관없어 보이는 예외가 튀어나올 수도 있다.
이런 에러는 클라이언트들의 디버깅을 어렵게 만든다.
때문에 추상화 수준에 맞춰 저수준의 예외를 잡아 새로운 예외로 다시 던져야 한다.
이로서 클라이언트는 왜 이런 에러가 나왔는지에 대해 충분한 정보를 얻고 보완할 수 있다.

try {
    ... // 저수준 추상화를 사용
} catch (LowerLevelException cause) {
    throw new HigherLevelException(cause);
}

예외의 상세 메시지에 실패 관련 정보를 담아라!
당연한 소리지만 실패 원인을 에러 정보에 담아야 디버깅이 수월해진다.

가능한 실패 원자적으로 만들어라!
DBMS의 Atomic 특성처럼 호출된 메서드가 실패하면
해당 객체는 메서드 호출 전 상태를 유지해야 한다는 소리다.
이렇게 구성하면 오류가 발생해도 문제없이 프로그램이 돌아갈 수 있다.