JAVA/Effective Java

규칙 58 복구가능 상태에는 점검지정 예외를 사용하고, 프로그래밍 오류에는 실행시점 예외를 이용하라.

위들 wedul 2018. 5. 29. 23:53

자바에는 몇 가지에 throwable을 제공한다.

점검지정 예외 (checked error)
컴파일 시점에 예외가 발생하는 부분으로 컴파일 시에 에러를 처리하는 코드를 삽입하지 않으면 컴파일이 되지 않는다.


1
2
3
4
5
6
7
8
9
10
public void ioOperation(boolean isResourceAvailable) {
  try {
    if (!isResourceAvailable) {
      throw new IOException();
    }
  } catch(IOException e) {
    // Handle caught exceptions.
  }
}
 
cs




unchecked error
컴파일 시점에 체크되지 않는 에러
실생시점 예외(runtime exception)와 오류(error)은 모두 unchecked error에 속한다.



실행시점 예외
NullPointerException, ArrayIndexOutOfBoundException와 같이 실행시간에 발생되는 에러



오류
OutofMemoryError ThreadDeath 같은 에러
catch 블럭으로 잡아도 대응 방법이 없다.




이런 예외들을 어떻게 기준을 잡고 처리해야 하는지 알아보자.

unchecked error의 기본적인 규칙은 caller 측에서 복구할것으로 여겨지는 상황에 대해서는 점검지점 예외를 사용해야한다.

-> 점검지점 예외를 사용한다는 것은 API 사용자에게 복구할 권한을 준다는 것이다. 그러므로 점검지점 예에서 발생한 에러는 catch에서 무조건 처리를 해야한다.


프로그래밍 오류를 표현할 때는 실행시점 예외를 사용하라.

-> 실행시점에 발생하는 대다수의 에러는 규칙위반으로 발생한다. 예를 들어 배열의 인덱스를 넘어가는 접근을 할때 발생하는 ArrayIndexOutOfBoundException이 대표적인 예이다.


예외 정보 문자열을 파싱해서 원하는 정보를 얻어서 처리하는 것은 굉장히 위험한 행동이다.

-> 예외정보는 각 버전 별로 변경될 수 있으며, 문자열에 경우 내용이 변하거나 없어질 수있다. 또한 정확한 예외에 대한 명세를 한 클래스 자체가 거의 없기 때문에 더욱더 위험하다.



결론을 말하면 복구 가능한경우에는 try-catch, throws를 사용하여 점검가능한 예외를 사용하고, 그것이 아닌 경우에는 실행시점 예외를 사용하라.

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙58 인용.