본문 바로가기

STUDY REVIEW/이펙티브 자바 독서스터디

[EFFECTIVE JAVA] 이펙티브 자바 독서스터디 - 10장 예외

10장 예외
아이템 69. 예외는 진짜 예외 상황에만 사용하라
아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라
아이템 71. 필요 없는 검사 예외 사용은 피하라
아이템 72. 표준 예외를 사용하라
아이템 73. 추상화 수준에 맞는 예외를 던지라
아이템 74. 메서드가 던지는 모든 예외를 문서화하라
아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라
아이템 76. 가능한 한 실패 원자적으로 만들라
아이템 77. 예외를 무시하지 말라

 

읽고 느낀 점

예외에 대해서 기억나는 것은 모든 메시지를 다 담으라는 것 뿐.

표준 예외를 외우도록 하자. 그 외에는 왜 프로그래밍 오류들이 다 런타임예외를 뱉어내는지 알아냈다는 점과 사수님도 이 책을 읽으셔서 그렇게 만드셨나 하는 의문이다.


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

 

일상적인 제어 흐름용으로 사용하지 말 것!


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

 

호출할 때 복구한다고 여겨지는 사항이면 검사 예외를 사용하고,

프로그래밍 오류를 나타낼 때는 런타임 예외를 사용하자

 

 '그래서 회사에서 프로그래밍 오류는 다 런타임 예외가 나왔구나~?! 🙄 이제야 로그보는 팁을 알아간다.' 

 

우리가 구현하는 비검사 Throwabledms ahen runtimeException의 하위 클래스여야 한다.


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

 

API 호출자가 예외 상황에서 복구할 방법이 없다면 비검사 예외를 던지게 만들자.

검사 예외를 회피하는 가장 쉬운 방법은 적절한 결과 타입을 담은 옵셔널을 반환하는 것이다!


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

 

예외도 마찬가지로 재사용하는 것이 좋으며, 예외는 직렬화할 수 있다는 사실을 기억하자!

예외 주요 쓰임
IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때 (null은 따로 NullPointerException으로 처리)
IllegalStateException 객체가 메서드를 수행하기에 적절하지 않은 상태일 때
NullPointerException null을 허용하지 않는 메서드에 null을 건넸을 때 
IndexOutOfBoundsException 인덱스가 범위를 넘어섰을 때
ConcurrentModificationException 허용하지 않는 동시 수정이 발견됐을 때 
UnsupportedOperationException 호출한 메서드를 지원하지 않을 때 

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

 

상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔줘야 한다.

try {
	..// 저수준 추상화를 이용
} catch (LowerLevelException e) {
  // 추상화 수준에 맞게 번역
  throw new HigherLevelException(...);
}

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

 

메서드가 던질 수 있는 예외를 각 @throws 태그로 문서화하되, 비검사 예외는 메서드 선언의 throws 목록에 넣지 말자.


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

 

모든 매개변수와 필드 값을 실패 메시지에 담자!


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


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

 

catch 블록을 비워두면 예외가 존재할 이유가 없어진다.