Skip to content

Commit

Permalink
[Item71]: 필요 없는 검사 예외 사용은 피하라 (depromeet#160)(시연)
Browse files Browse the repository at this point in the history
  • Loading branch information
siyeonSon committed Sep 10, 2023
1 parent 90930a5 commit 3797483
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions Ch10/item71/필요_없는_검사_예외_사용은_피하라.md
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 값을 반환하는 메서드로 리팩터링할 수 있다. 더 아름다운 구조는 아니지만, 유연하다
- 하지만 외부 동기화가 없기 때문에 외부 요인에 의해 상태가 변경될 수 있다면 적절하지 않다. 또한 상태 검사 메서드가 작업 일부를 중복 수행해서 발생하는 성능 손해도 있을 수 있다

0 comments on commit 3797483

Please sign in to comment.