[Effective Java] 57. 예외는 예외적 상황에만 사용하라

최대 1 분 소요

Exception은 말 그대로 예외적인 상황을 위해서만 사용해야 한다.
Exception을 흐름 제어에 사용해서는 안된다.

1. 예외를 흐름 제어에 사용한 잘못된 예

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

위 예는 루프를 벗어나는 조건으로 Exception을 사용하고 있다.
어쩌면 반복문에 있는 조건문을 없애서 성능 개선을 하려고 한 것일수도 있다.

하지만 최신 JVM으로 돌려보면 예외를 통해 구현한 반복문이 표준 반복문보다 성능이 느리다.

그리고 무엇보다도 이러한 구현은 원래 코드 목적을 흐리게되고 다른 이유로 발생하는 예외를 잡아버릴 수 있어 올바른 동작을 보장하지 못하게 하는 잠재적 버그를 가질 수 있다.

2. 잘 설계된 API에서의 예외처리

api에서 위와 같이 흐름 제어의 일부로 Exception을 사용하도록 강요해선 안된다.

만약 어떠한 상태에 종속적으로 동작하는 메서드가 있다면 해당 메서드에서 상태를 체크 후 Exception을 던지는 것이 아니라 해당 상태를 만족하는지를 확인하는 또 다른 상태 점검 메서드를 만들면 된다.

아래 Iterator 예를 보면 hasNext()라는 메서드로 상태 체크를 한다.

for(Iterator<Foo> i = c.iterator(); i.hasNext(); ) {
	Foo foo = i.next();
}

만약 위와같이 상태체크를 하기 싫다면 null과 같이 특이값이 반환되도록 할 수도 있을 것이다.

댓글남기기