필요 없는 검사 예외 사용은 피하라

김종준·2023년 9월 13일
0

이펙티브자바

목록 보기
58/63

필요 없는 검사 예외 사용은 피하라

검사 예외를 싫어하는 자바 프로그래머가 많지만 제대로 활용하면 API와 프로그램의 질을 높일 수 있다.

결과를 코드로 반환하거나 비검사 예외를 던지는 것과 달리, 검사 예외는 발생한 문제를 프로그래머가 처리하여 안정성을 높이게끔 해준다.

하지만, 검사 예외를 과하게 사용하면 오히려 쓰기 불편한 API가 된다.

어떤 메서드가 검사 예외를 던질 수 있다고 선언됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야만 한다.

어느 쪽이든 API 사용자에게 부담을 준다.

더구나 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더욱 커졌다.

API를 제대로 사용해도 발생할 수 있는 예외거나, 프로그래머가 의미 있는 조치를 취할 수 있는 경우라면 괜찮다.

그러나 둘 중 어디에도 해당하지 않는다면 비검사 예외를 사용하는 게 좋다.

검사 예외와 비검사 예외 중 어느 것을 선택해야 할지는 프로그래머가 그 예외를 어떻게 다룰지 생각해 보면 알 수 있다.

검사 예외가 프로그래머에게 지우는 부담은 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다.

이 상황에서는 검사 예외를 안 던지는 방법이 있는지 고민해 볼 가치가 있다.

검사 예외를 회피하는 가장 쉬운 방법은 적절한 결과 타입을 담은 옵셔널을 반환하는 것이다.

검사 예외를 던지는 대신 단순히 빈 옵셔널을 반환하면 된다.

이 방식의 단점이라면 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다는 것이다.

반면, 예외를 사용하면 구체적인 예외 타입과 그 타입이 제공하는 메서드를 활용해 부가 정보를 제공할 수 있다.

또 다른 방법으로, 검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꿀 수 있다.

이 방식에서는 첫 번째 메서드는 예외가 던져질 여부를 boolean 값으로 반환한다.

리펙터링 전 )

try {
  obj.action(args);
} catch(TheCheckedException e) {
  ... 
}

리펙터링 후)

if(obj.actionPermitted(args)) { // boolean으로 예외 여부 판단
  obj.action(args);
} else {
  ... 
}

0개의 댓글