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

검사 예외 vs 비검사 예외 vs 빈 옵셔널

  • 검사 예외를 던지는 메서드는 스트림 내부에서 직접 사용할 수 없어 부담이 커진다.

  • API를 제대로 사용해도 발생할 수 있는 예외이거나, 클라이언트가 의미있는 조치를 취할 수 있는 경우에만 검사 예외를 사용하고, 아니면 비검사 예외를 사용하자.

  • 검사 예외를 던지는 대신 빈 옵셔널을 반환하면 단순하다. 하지만 예외가 발생한 이유를 알릴 수 없다.

  • 예외를 반환하면 구체적인 예외 타입과 예외 타입이 제공하는 메서드들을 활용해 부가 정보를 제공할 수 있다. (item 70)

검사 예외를 비검사 예외로 바꾸기

  • 이러한 방법은 권장하지 않는다.

  • 검사 예외를 던지는 기존 코드이다.

try {
    obj.action(args);
} catch (TheCheckedException e) {
    ...// 예외 상황에 대처한다.
}
  • 검사 예외를 던지는 메서드를 쪼개서 비검사 예외로 변경한다.

  • 아래 예제에서는 예외가 던져질 지 여부를 반환하는 actionPermitted 메서드(상태 검사 메서드, item 69)를 사용한다.

if (obj.actionPermitted(args)) {
    obj.action(args);
} else {
    ...// 예외 상황에 대처한다.
}
  • 혹은 실패 시 스레드를 중단하길 원한다면 아래와 같이 작성해도 무방하다.

obj.action(args);
  • 하지만 멀티 스레드이거나 상태 검사 중 action 로직을 일부 수행하는 상황이라면, 오류가 나거나 성능 상 손해가 있을 수 있어 이 리팩토링이 적절하지 않다.

Last updated