꼭 필요한 곳에만 사용한다면 검사 예외는 프로그램의 안전성을 높여주지만, 남용하면 쓰기 고통스러운 API를 낳는다. API 호출자가 예외 상황에서 복구할 방법이 없다면 비검사 예외를 던지자.
복구가 가능하고 호출자가 그 처리를 해주길 바란다면, 우선 옵셔널을 반환해도 될지 고민하자.
옵셔널 만으로는 상황을 처리하기에 충분한 정보를 제공할 수 없을 때만 검사 예외를 던지자
필요 없는 검사 예외 사용시 불편한 점
- 물론, 검사 예외를 과하게 사용하면 오히려 쓰기 불편한 API가 됨. 어떤 메서드가 검사 예외를 던질 수 있다고 선언 됐다면, 이를 호출하는 쪽에서 catch 블록 혹은, 예외를 붙잡아 처리, 더 바깥으로 던져 문제를 전파해야 함 → API 사용자에게 부담
- 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더욱 커짐
- API를 제대로 사용해도 발생할 수 있는 예외이거나, 프로그래머가 의미 있는 조치를 취할 수 있는 경우라면 이 정도 부담쯤은 받아들일 수 있을 것이지만, 둘 중 어디에도 해당되지 않는다면 비검사 예외를 사용하는 게 좋다
- 메서드가 단 하나의 검사 예외만 던질때 부담이 특히 큼. 해당 예외가 붙여짐으로 try 블록 추가해야 하고 stream에서 사용하지 못하게 되기에
검사 예외 회피하는 방법
- 적절한 결과 타입을 담은 옵셔널을 반환하는 것. 검사 예외를 던지는 대신 단순히 빈 옵셔널을 반환
- 단점 : 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다는 것
- 반면, 예외를 사용하면 구체적인 예외 타입과 그 타입이 제공하는 메서드들을 활용해 부가 정보를 제공할 수 있음
- 검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꿀 수 있음
try { obj.action(args); } catch (TheCheckedException e) { ... // }
if (obj.actionPermitted(args)) { obj.action(args); } else { ... // 예외 상황에 대처 }