Open minSW opened 3 years ago
try{ obj.action(args); } catch (TheCheckedException e) { }
-> if (obj.actionPermitted(args) { obj.action(args); }
next()
(상태의존적), hasNext()
(상태검사)Error
는 상속하지 말 것
RuntimeException
하위일 것Throwable
(Checked) 의 상속
Exception
Error
, RuntimeException
p.393
하단 예제1 🤔IllegalArgumentException
, ConcurrentModificationException
, UnsupportedOperationException
IllegalStateException
(인수 값이 무엇이든 어차피 실패했을 경우) vs IleegalArgumentException
(인수 값에 관계가 있는 경우)Throwable.getCause()
로 꺼내기 가능@throws
로 정확히 문서화
@throws
에는 포함 X (검사 vs 비검사 예외 구분)ignored
를 사용할 것
try {
int i = 0;
while(true)
range[i++].climb();
} catch (ArrayIndexOutOfBoundsException e) {
}
for (Mountain m : range) m.climb();
배열에 접근할 때 마다, 배열 경계인지 아닌지를 검사하는데 배열 경계 검사 중복을 피하기 위해
try-catch를 사용했는데, 하지마라.
## Item70 복구할 수 있는 상황에는 검사예외를, 프로그래밍 오류에는 런타임 예외를 사용하라.
## Item71 필요없는 검사 예외 사용은 피하라.
* API를 제대로 사용해도 발생하는 예외 혹은 프로그래머가 예외를 **의미있게** 처리할 수 있으면 **검사 예외**를,
아니라면 **비검사예외**를 사용해라.
## Item72 표준 예외를 사용하라.
* `IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException` 등과 같이 표준 예외를 사용해라.
- 내가 작성한 API를 다른 사람이 사용할때, 읽기 쉬워진다.
* `Exception, RuntionException, Throwable, Error`는 추상 클래스라고 생각하고 직접 재사용하지 말아라.
## Item73 추상화 수준에 맞는 예외를 던지라.
* `예외 번역(exception translation)`: 상위 계층에서는 저수준 예외를 잡아, 자신의 추상화 수준에 맞는 예외로 바꿔 던저라.
- 디버깅을 위해 저수준 예외가 필요하면, **예외 연쇄(exception chaining)`을 사용하는 것이 좋다.
## Item74 메서드가 던지는 모든 예외를 문서화하라.
* **검사 예외**는 따로따로 선언하고, 자바독 `@throws` 태그를 사용하여 정확히 문서화화자. (뭉뚱그리기 ㄴㄴ)
* 검사예외는 메서드 선언의 throws 문에 일일이 선언하고, 비검사 예외는 메서드 선언에는 기입 ㄴㄴ (구분)
## Item75 예외의 상세 메시지에 실패 관련 정보를 담으라.
* 발생한 예외에 관여된 **모든 매개변수와 필드의 값**을 실패 메세지에 담아라.
* 검사 예외라면, 복구를 위해 실패 메세지에 사용된 접근자 메서드를 구현해라.
(비검사 예외라면, 사용되는 경우는 거의 없으니 구현할 수 있으면 구현해라.)
## Item76 가능한 한 실패 원자적으로 만들라.
* `실패 원자적(failure-atomic)`: 호출된 메서드가 실패할 경우, 해당 객체는 메서드 호출 전 상태를 유지하는 특성
* 방법
- 불변 객체로 설계
- 작업 수행 전 매개변수의 유효성을 검사
+ 모든 실패할 가능성이 있는 코드를, 객체 상태를 변경하는 코드보다 앞에 배치
- 임시 복사본에서 작업을 수행하고, 성공하면 객체 교환
- 실패를 가로채는 복구 코드를 작성해서, 작업 전 상태로 되돌리기 (자주쓰이는 방법은 아님)
* 명세에 기록한 예외라면, **예외가 발생해도 객체의 상태는 메서드 호출 전과 똑같이 유지되는 것이 기본(failure-atomic)**이며,
지키지 못한다면 **실패 시의 객체 상태를 명시**해라.
## Item77 예외를 무시하지 말라.
* 빈 catch 블록으로 예외를 무시하지 마라.
* 예외를 무시해야하는 상황이라면, 예외 변수의 이름을 ignored로 사용하고 이유를 주석으로 남기자
try { } catch (TimeoutException ignored) { // 이유 기록 }
## Todo
- [ ] 에러와 예외 차이에 대해 조사해보기
10장 예외
목차