strange-study / ss-effective-java

효과적인 자바 스터디 ✊🏻
2 stars 2 forks source link

10장 예외 (week9) #10

Open minSW opened 3 years ago

minSW commented 3 years ago

10장 예외

Schedule : 21.07.07 (수) 9PM

목차

KimYealynn commented 3 years ago

아이템 69. 예외는 진짜 예외 상황에만 사용하라

아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라

아이템 71. 필요 없는 검사 예외 사용은 피하라

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

아이템 73. 추상화 수준에 맞는 예외를 던지라

아이템 74. 메서드가 던지는 모든 예외를 문서화하라

아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라

아이템 76. 가능한 한 실패 원자적으로 만들라

아이템 77. 예외를 무시하지 말라

minSW commented 3 years ago

10장 예외

item 69

item 70

item 71

item 72

item 73

item 74

item 75

item 76

item 77

jin5335 commented 3 years ago

10장 예외

Item69 예외는 진짜 예외 상황에만 사용하라.

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
- [ ] 에러와 예외 차이에 대해 조사해보기