Effective Java ch8

Chapter 8 예외처리

 

항목 39 : 예외는 예외상황에서만 써야 한다.

(Use exceptions only for exceptional conditions)

예외를 생성하고 던지고 잡는 것은 비용이 많이 드는 작업이고 JVM의 최적화 대상에서 빠질 수 있다. 프로그램 흐름을 예외로 제어하려 하면 안된다. 좋은 API는 클라이언트가 프로그램 흐름을 제어할 때 예외를 쓸 수 밖에 없도록 만들지 않는다.

 

항목 40 : 처리해야 하는 예외와 런타임 예외를 구분해서 던져라

(Use checked exceptions for recoverable conditions and runtime exceptions for programming errors.)

Checked Exception은 호출자가 예외상황을 복구할 수 있다고 기대할 때 던진다.런타임오류는 프로그래밍 오류가 발생했을 때만 써야 한다.Error의 하위 클래스는 만들지 말고 처리하지 않는 예외는 모두 RuntimeException의 하위클래스이어야 한다.

 

항목 41 : 처리해야 하는 예외는 꼭 필요할 때만 던져라.

(Avoid unnecessary use of checked exceptions)

catch절에서 특별한 할 일이 없이 없는 API를 checked exception으로 처리하는 것은 프로그램만 더 복잡하게 만들 뿐이다.

 

항목 42 : 표준예외를 써라

IllegalArgumentException, IllegalStatementException, UnsupportedOperationException, ConcurrentModificationException 등 Java의 표준예외를 최대한 사용한다.

 

항목 43 : 예외를 적절하게 추상화 하라.

(Throw exceptions appropriate to the abstraction.)

높은 계층에서 낮은 계층의 예외를 잡아서 높은 계층의 추상화 수준에 맞게 변환해서 던져야 한다. 예외변환(Exception translation) 패턴

 

항목 44 : 메소드가 던지는 모든 예외를 명세문서에 기술하라

처리해야 하는 에외는 메소드 선언부에 하나씩 선언하고, @throws 태그를 써서 모든 예외가 발생하느 상황을 정확하게 문서화하라. 단지 귀찮다는 이유만으로, 공통 상위타입으로 예외를 던지려 하지 마라. 처리하지 않는 예외는 @throws 태그를 써서 명세문서에 기술하지만, 메소드 선언의 throws 절에는 나타나지 말아야 한다.

 

항목 45 : 실패에 대한 자세한 정보를 상세 메시지 문자열에 담아라

 실패원인을 포착하려면, 예외의 문자열 표현에 반드시 예외 발생에 영향을 준 모든 필드와 인자의 값이 들어 있어야 한다.

 

항목 46 : 실패 원자성을 얻기위해 노력하라.

메소드 호출이 실패하더라도 객체상태는 메소드 호출 전과 같아야 한다. 오류(error)는 예외(exception)와 달리 보통 복구할수 없기 때문에 오류가 발생했을 때 실패 원자성을달성하기 위해 애쓸 필요가 없다.

 

항목47 : 예외를 잡아서 버리지 마라

try{

... 

} catch (SomeException e){

}

 

빈 catch block은 "예외 사항을 처리하라"라고 알려주는 예외의 존재 이유 자체를 짓발는 것이다. catch block 안에서 정말 아무 것도 할 것이 없다면, 최소한 왜 예외를 잡아서 처리하지 않고 버리는지 그 이유라도 주석으로 달아 놓아야 한다.