forked from depromeet/effective-java-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Item71]: 필요 없는 검사 예외 사용은 피하라 (depromeet#160)(시연)
- Loading branch information
Showing
1 changed file
with
34 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# item71. 필요 없는 검사 예외 사용은 피하라 | ||
> 검사 예외는 프로그램 안전성을 높여주지만, 남발하면 괴로워진다. 옵셔널 반환을 고민하자. 옵셔널만으로 상황 처리에 충분한 정보 제공이 어렵다면 검사 예외를 던지자 | ||
## 검사 예외의 문제 | ||
- 검사 예외를 남발하면 쓰기 불편한 API가 된다 | ||
- 어떤 메서드가 검사 예외를 던질 수 있다고 선언 됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야한다. API 사용자에게 부담을 준다 | ||
- 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더 커졌다 | ||
- API를 제대로 사용해도 발생할 수 있거나, 프로그래머가 의미있는 조치를 취할 수 있다면 받아들일 수 있지만, 둘다 해당이 안되면 **비검사 예외**를 사용하는 게 좋다 | ||
|
||
## 비검사 예외 | ||
- 적절한 결과 타입을 담은 **옵셔널**을 반환하는 방법으로 개선할 수 있다 | ||
- 검사 예외를 던지는 대신 단순히 빈 옵셔널을 반환한다 | ||
- 그러나 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다 | ||
|
||
```java | ||
// 검사 예외를 던지는 메서드 - 리팩터링 전 | ||
try { | ||
obj.action(args); | ||
} catch (TheCheckedException e) { | ||
... // 예외 상황에 대처한다 | ||
} | ||
``` | ||
|
||
```java | ||
// 상태 검사 메서드와 비검사 예외를 던지는 메서드 - 리팩토링 후 | ||
if (obj.actionPermitted(args)) { | ||
obj.action(args); | ||
} else { | ||
... // 예외 상황에 대처한다 | ||
} | ||
``` | ||
|
||
- try-catch 블록을 boolean 값을 반환하는 메서드로 리팩터링할 수 있다. 더 아름다운 구조는 아니지만, 유연하다 | ||
- 하지만 외부 동기화가 없기 때문에 외부 요인에 의해 상태가 변경될 수 있다면 적절하지 않다. 또한 상태 검사 메서드가 작업 일부를 중복 수행해서 발생하는 성능 손해도 있을 수 있다 |