Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

아이템 72. 표준 예외를 사용하라 #67

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions 10장/아이템_72/표준_예외를_사용하라.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# 아이템 72. 표준 예외를 사용하라

### 숙련된 프로그래머는 많은 코드를 재사용한다.

- 예외도 마찬가지로 재사용하면 좋음
- 표준 예외를 사용하면 다른 사람이 익히고 사용하기 쉬워짐
- 메모리 사용량이 줄고 클래스를 적재하는 시간도 적게 걸림

### 많이 사용하는 표준 예외

- `IllegalArgumentException`
- 호출자가 인수로 부적절한 값을 넘김
- 예) 반복 횟수를 음수로 넘김
- `IllegalStateException`
- 대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않음
- 예) 초기화되지 않은 객체를 사용하려고 함
- `NullPointerException`
- null 값을 허용하지 않는 메서드에 null을 건넴
- `IndexOutOfBoundsException`
- 허용 범위를 넘는 값을 건넴
- `ConcurrentModificationException`
- 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 함
- 동시 수정을 확실히 검출하기는 힘듦. 이 예외는 경고 역할을 함.
- `UnsupportedOperationException`
- 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때
- 구현하려는 인터페이스의 메서드 일부를 구현할 수 없을 때
- 예) 원소 추가만 할 수 있는 List의 구현체가 있는데 누군가가 remove 메서드를 호출

### ⚠️ 추상 클래스 역할을 하는 표준 예외

- `Exception`, `RuntimeException`, `Throwable`, `Error`는 직접 재사용하지 말자
- 추상 클래스라고 생각하자.

### 특수 상황에 사용할 수 있는 표준 예외

- `ArithmeticException` or `NumberFormatException`
- 예) 유리수나 복소수를 다루는 객체

### 기준이 모호해서 어떤 예외를 사용할 지 모르겠어요 🤔

- 예외의 주요 쓰임이 상호 배타적이지 않다.
- 예) 덱에서 n장의 카드 뽑기를 요청했는데, 남은 카드 수가 더 적을 때
- 트레: 인수의 값이 너무 크니까 `IllegalArgumentException`을 써야지!
- 우주: 덱이 카드가 너무 적은 상태니까 `IllegalStateException`을 써야지!
- 일반적으로는
- 인수 값이 무엇이었든 어차피 실패 → `IllegalStateException`
- 특정 인수 값 때문에 실패 → `IllegalArgumentException`

# 결론

- 상황에 부합한다면 표준 예외를 사용하자.
- 가독성이 좋아지고 성능도 좋아지고 직렬화를 신경쓰지 않아도 된다.
- 단, API 문서를 참고해 어떤 상황에 예외가 던져지는지 파악하고, 맥락이 부합해야 한다.
- 그렇지만 스프링을 사용하는 우리는…?