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

들어가며

자바는 문제 상황을 알리는 타입으로 checked exception, unchecked exception, error 세가지를 제공한다. 다음은 이를 사용하기 위한 가이드 라인이다.

Checked Exception

checked exception은 호출하는 쪽에서 복구하리라 여겨지는 상황일때 사용해야 한다. checked exception을 던지면 호출자가 그 예외를 catch로 잡아 처리하거나 더 바깥으로 전파하도록 강제하게 된다. 따라서 그 메소드를 호출했을 때 발생할 수 있는 오류 상황을 API 사용자에게 알릴 수 있다.

Unchecked Throwable

unchecked Throwable은 Runtime Exception과 Error로 구분된다. 이 둘은 통상적으로 프로그램에서 잡을 필요가 없거나 잡지 말아야 한다. 이 둘이 발생했다는 것은 복구가 불가능하거나 더 실행해봐야 득보다는 실이 많다는 이야기다. 이런 throwable을 잡지 않은 스레드는 적절한 오류 메세지를 뱉으며 중지한다.

프로그래밍 오류를 나타낼 때는 Runtime Exception을 사용하자. 런타임 예외의 대부분은 전제조건을 만족하지 못했을 때 발생한다. 예를 들어 ArrayIndexOutOfBoundsException은 배열의 인덱스는 0부터 배열 크기 - 1이라는 제약을 충족시키지 못했을 때 발생한다.

Error는 보통 JVM이 자원 부족, 불변식 깨짐 등 더 이상 수행을 계속할 수 없는 상황을 나타낼 때 사용한다. 그렇기 때문에 개발자가 구현하는 비검사 throwable은 대부분 RuntimeException의 하위 클래스다.

Exception, RuntimeException, Error를 상속하지 않는 throwable을 만들 수도 있지만 절대 권장하지 않는다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/22/Languages/Effective%20JAVA/item70/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.