■ 검사 예외의 문제
- 검사 예외를 남발하면 쓰기 불편한 API가 된다.
- 어떤 메서드가 검사 예외를 던질 수 있다고 선언 됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야한다. API 사용자에게 부담을 준다.
- 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더 커졌다.
- API를 제대로 사용해도 발생할 수 있거나, 프로그래머가 의미있는 조치를 취할 수 있다면 받아들일 수 있지만, 둘다 해당이 안되면 비검사 예외를 사용하는 게 좋다.
특히 검사 예왹사 프로그래머에게 지우는 부담은 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다. 이미 다른 검사 예외도 던지는 상황에서 또 다른 검사 예외를 추가하는 경우라면 기껏해야 catch문 하나 추가하는 선에서 끝이다.
■ 개선 방안
- 적절한 결과 타입을 담은 옵셔널을 반환하는 방법으로 개선할 수 있다.
- 단점은 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다는 것이다.
try {
obj.action(args);
} catch (TheCheckedException e) {
// ...
}
if (obj.actionPermitted(args)) {
obj.action(args);
} else {
// ...
}
try-catch 블록을 boolean 값을 반환하는 메서드로 리팩터링할 수 있다.더 아름다운 구조는 아니지만, 유연하다.
하지만 외부 동기화가 없기 때문에 외부 요인에 의해 상태가 변경될 수 있다면 적절하지 않다. 또한 상태 검사 메서드가 작업 일부를 중복수행해서 발생하는 성능 손해도 있을 수 있다.
■ 핵심 정리
- 검사 예외는 프로그램 안전성을 높여주지만, 남발하면 괴로워진다.
- 옵셔널 반환을 고민하자. 옵셔널만으로 상황 처리에 충분한 정보 제공이 어렵다면 검사 예외를 던지자.
'Effective Java' 카테고리의 다른 글
[Effective Java] 아이템73 추상화 수준에 맞는 예외를 던지라 (0) | 2021.08.22 |
---|---|
[Effective Java] 아이템72 표준 예외를 사용하라 (0) | 2021.08.22 |
[Effective Java] 아이템70 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 (0) | 2021.08.22 |
[Effective Java] 아이템69 예외는 진짜 예외 상황에만 사용하라 (0) | 2021.08.22 |
[Effective Java] 아이템68 일반적으로 통용되는 명명 규칙을 따르라 (0) | 2021.08.01 |