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

-Java는 문제 상황을 알리는 타입 (Throwable)으로 3가지 ( 검사 예외, 런타임 예외 , 에러 ) 를 제공한다.

(ref- https://butter-shower.tistory.com/87 )

  • RuntimeException은 예외처리를 하지 않아도 컴파일 가능한 비검사형 예외이며, 검사형 예외(ex) IllegalAccessException)는 예외 처리를 하지 않으면 컴파일 오류가 터지므로 꼭 처리해주어야 하는 예외이다.

  • Error class도 비검사형 예외에 속하며, Exception class 와 차이점은 시스템레벨에서 비정상적인 상황이 발생한 심각한 수준의 오류라고 한다. 반면 Exception은 개발자가 구현한 로직에서 발생한 오류이다.

어떤 상황에서 어떤 예외 타입을 사용해야 하는가?

  • 호출하는 쪽에서 복구하리라 판단되는 상황에서는 검사 예외를 사용하라. 검사 예외를 사용하면 client가 예외를 처리하거나 더 바깥쪽으로 throw 하도록 강제하게 된다.

  • 검사 예외는 복구할 수 있는 조건에서 사용됨으로, client가 복구하기 편하게 필요한 정보를 알려주는 method를 제공해주면 좋다.

  • 보통 API 설계자가 검사 예외를 사용했다는 말은 이 API를 사용하는 client가 이를 처리해야 한다고 요구한것이며, 이를 그냥 잡기만 하고 별도로 처리하지 않는 경우는 대부분 바람직하지 않다고 한다.

  • 프로그래밍 오류를 나타내는 상황에서는 런타임 예외를 사용하라. 런타임 예외 대부분은 API를 호출한 client가 전제 조건을 만족시키지 못했을때 발생한다. 예를 들면 ArrayIndexOutOfBoundException 이 있다.

  • 에러는 시스템레벨의 오류이니, 에러 클래스를 상속해 하위 클래스를 만드는 행위는 지양하는 것을 권고하고 있다. 따라서 개발자가 만드는 비검사예외는 모두 RuntimeException의 하위 클래스여야 한다. (AssertionError 제외)

  • 추가로 Exception,RuntimeException,Error 를 모두 상속하지 않는 Throwable 인터페이스를 구현하는 것은 혼란만 주니 절대 사용하지 말라고 권고하고 있다.

Comments