<이펙티브 자바> 10. 예외
by BFine반응형
69. 예외는 진짜 예외상황에만 사용하자
- 예외는 절대 제어 흐름용으로 쓰여선 안된다
- 잘 설계된 API라면 클라이언트가 정산적인 제어흐름에서 예외를 사용할일이 없게 해야한다.
- Try-catch안에 코드를 넣으면 JVM이 적용할 수 있는 최적화가 제한된다.
70. 복구가능 → 검사 예외, 프로그래밍 오류에는 런타임 예외
- 자바의 문제사항 알리는 타입 3가지
- 검사 예외
- 런타임 예외
- 에러
- 호출하는 쪽에서 복구할경우는 검사 예외를 사용하자
- 검사예외를 던지면 catch로 잡거나 바깥으로 전파하도록 강제해야한다
- 비검사 throwable은 두가지로 런타임 예외와 에러다
- 잡을 필요가 없거나 잡지말아야한다.
- 비검사 예외를 던졌다는 것은 복구 불가능이거나 득보다 실이 많다는 뜻
- 프로그래밍 오류를 나타낼때는 런타임 예외를 사용하자
- 대부분은 전제조건을 만족하지 못했을때 발생한다.
- ex) 배열크기가 -1
- 복구가능 하다면 검사 예외 ,그렇지 않다면 런타임 예외를 사용하자
- 비검사 throwable은 모두 RuntimeException의 하위 클래스 여야 한다.
- 대부분은 전제조건을 만족하지 못했을때 발생한다.
71. 필요없는 검사 예외 사용은 피하자
발생한 문제를 프로그래머가 처리하여 안전성을 높이게끔 해준다
검사예외를 회피하는 가장 쉬운 방법은 옵셔널을 반환하는 것이다.
- 단점은 예외 발생이유에 대한 부가정보를 담을 수 없음
검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꿀수 있다
Catch 블록을 비워두면 예외의 존재이유가 없어진다
예외를 무시하기로 했다면 catch 안에 주석으로 남기고 변수 이름도 ignored로 바꾸자
try{ obj.action(); }catch(TheCheckedException e){ // 예외사항에 대처 } if(obj.actionPermitted(args)){ obj.action(); }else{ // 예외사항에 대처 }
72. 예외를 무시하지 말자
호출된 메서드가 실패하더라도 해당 객체는 메서드 호출전 상태를 유지해야한다.
- 간단한 방법은 불변객체로 만들자
매개변수의 유효성을 검사하자
public Object pop(){ if(size==0) throw new EmptyStackException(); Object result = elements[--size]; }
- 적지않아도 비어있다면 예외를 던지지만 음수가되어 호출 실패시엔 ArrayIndexOutOfBoundsException을 던진다 (상황에 안어울린다.)
임시 복사본에서 작업을 수행한뒤 완료시 원래객체와 변경해서 실패 원자성을 얻는다
실패를 가로채는 복구코드를 작성하여 원래상태로 되돌리는 방법(?)
73. 가능한 한 실패 원자적으로 만들자
- 실패순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메세지에 담아야한다.
74. 예외의 상세 메세지에 실패 관련정보를 담자
- 검사예외는 항상 따로따로 선언하고 예외상황을 @throws 태그로 정리
- 비검사 예외는 넣지말것
75. 메서드가 던지는 모든 예외를 문서화 하자
상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야한다. (예외번역)
예외 연쇄란 문제의 근본 원인인 저수준 예외를 고수준 예외에 실어보내는것
try{ //저수준 }catch(LowerLevelExcpetion cause){ throw new HigherException(cause); }
가장 최선은 저수준 메서드가 반드시 성공시켜 예외를 전파시키지 않아야한다.
76. 추상화 수준에 맞는 예외를 던지자
- IllegalArgumentException
- 호출자 인수가 부적절한 값을 넘길떄 사용
- 가장 많이 사용 되는 예외
- ConcurrentModificationException
- 여러 스레드가 동시에 수정하려 할떄 던진다
- UnsupportedOperationException
- 클라이언트가 요청한 동작 대상 객체가 지원하지 않을때 던진다
- Exception, RuntimeException , Throwable, Error는 직접 재사용하지 말자
반응형
'개발서적 > 이펙티브 자바' 카테고리의 다른 글
<이펙티브 자바> 12. 직렬화 (0) | 2021.01.27 |
---|---|
<이펙티브 자바> 11. 동기화 (0) | 2021.01.26 |
<이펙티브 자바> 8. 메서드 (0) | 2021.01.21 |
<이펙티브 자바> 7. 람다와 스트림 (0) | 2021.01.17 |
<이펙티브 자바> 6. 열거 타입과 애너테이션 (0) | 2021.01.15 |
블로그의 정보
57개월 BackEnd
BFine