본문 바로가기
Effective Java

[Effective Java] 아이템71 필요 없는 검사 예외 사용은 피하라

by byeongoo 2021. 8. 22.

■ 검사 예외의 문제

  • 검사 예외를 남발하면 쓰기 불편한 API가 된다.
  • 어떤 메서드가 검사 예외를 던질 수 있다고 선언 됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야한다. API 사용자에게 부담을 준다.
  • 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더 커졌다.
  • API를 제대로 사용해도 발생할 수 있거나, 프로그래머가 의미있는 조치를 취할 수 있다면 받아들일 수 있지만, 둘다 해당이 안되면 비검사 예외를 사용하는 게 좋다.

 

특히 검사 예왹사 프로그래머에게 지우는 부담은 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다. 이미 다른 검사 예외도 던지는 상황에서 또 다른 검사 예외를 추가하는 경우라면 기껏해야 catch문 하나 추가하는 선에서 끝이다.

 

■ 개선 방안

  • 적절한 결과 타입을 담은 옵셔널을 반환하는 방법으로 개선할 수 있다.
  • 단점은 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다는 것이다.
try {
    obj.action(args);
} catch (TheCheckedException e) {
    // ...
}
if (obj.actionPermitted(args)) {
    obj.action(args);
} else {
    // ...
}

 

 

try-catch 블록을 boolean 값을 반환하는 메서드로 리팩터링할 수 있다.더 아름다운 구조는 아니지만, 유연하다.

하지만 외부 동기화가 없기 때문에 외부 요인에 의해 상태가 변경될 수 있다면 적절하지 않다. 또한 상태 검사 메서드가 작업 일부를 중복수행해서 발생하는 성능 손해도 있을 수 있다.

 

■ 핵심 정리

  • 검사 예외는 프로그램 안전성을 높여주지만, 남발하면 괴로워진다.
  • 옵셔널 반환을 고민하자. 옵셔널만으로 상황 처리에 충분한 정보 제공이 어렵다면 검사 예외를 던지자.