이 글에서는 표준 예외와 사용자 정의 예외를 알아본다.
목차
1. 표준 예외, 사용자 정의 예외
2. 예외 선택 기준
표준 예외, 사용자 정의 예외
표준 예외:
- 언어가 기본적으로 제공하는 예외
- IllegalArgumentException, IllegalStateException, NullPointerException... etc
- 크게 3가지로 나뉜다.
Exception - 검사 예외, checked Exception
RuntimeException - 비검사 예외, unchecked Exception
Error - 에러
장점
1. 사람들이 익숙함
2. 가독성, 유지보수성 좋음
사용자 정의 예외:
- 사용자가 직접 정의하거나 표준 예외를 확장한 예외
- 예를들어, 은행 시스템에서 출금시 잔고가 모자란 경우 위해
public class BalanceInsufficientException extends IllegalStateException{
}
이렇게 정의한 예외 클래스 만들수 있음.
장점
1. 예외의 응집도 향상
- 책임이 분명하고, 그렇기에 후처리가 용이함
- 상위 계층 예외일수록 정확한 문제가 뭔지 특정하기 어렵기 때문.
2. 이름만으로 예외 구별 가능
3. 상세하고 특징적인 정보 제공 가능
- 예외도 완전한 클래스이다. 사용자 정의 예외 클래스에서 특정한 상황에 맞는 동작을 정의해놓고 재사용할수 있다. 그렇기에 여러 클래스에서 표준예외의 메세지를 매번 지정안해도 된다.
예외 선택 기준
언제 어느 예외를 발생시켜야 할까?
기본적으로 표준 예외를 재사용하고,
이를 확장한 사용자 정의 예외는 응집도향상, 상세 정보 제공 등이 필요하다 판단할 때만 사용한다.
표준 예외는 크게 Exception(checked), RuntimeException (unchecked), Error 3가지 종류가 있다.
재사용시 세부적인 선택기준과 주의점은 뭘까?
1. Exception(checked)
- 복구할수 있는 상황. 클라이언트 잘못이 아닌 경우.
예시) 배열 크기가 너무 큰 경우,
1. 프로그래머 실수로 너무 크게 할당한 경우 - unchecked인 예외 발생시키기
2. 합리적인 크기로 할당했는데 컴퓨팅 리소스가 너무 적었던 경우 - checked인 예외 발생시키기.
- 복구에 필요한 정보 제공 메서드도 만들기 (은행 잔고가 부족하면 얼마나 부족한건지 알려주는 메서드)
- 그냥 Optional 반환할지 고려하기. 그러나 복구에 필요한 추가 정보 필요하면 Exception 발생시키기.
- 처리를 강제해서 불편하기 때문에 신중히 사용해야함
2. RuntimeException (unchecked)
- 프로그래밍 오류 (클라이언트가 전제조건을 못지킴)
- 복구할수 있는지, 프로그래밍 오류인지 햇갈리면 RuntimeException 상속받기
3. Error
- 상속 하지 말기. 업계 표준임. unchecked 는 전부 RuntimeException으로 하기
- throw도 하지말기. AssertionError 제외
추가적으로
Exception, RuntimeException, Error 전부 아닌 Throwable 객체
- 만들지 말기. 쓸데없이 햇갈리기만 함.
출처
1. 조슈아 블로크, 『Effective Java』, 이복연 역 (인사이트, 2018), 386 ~ 412
2. https://tecoble.techcourse.co.kr/post/2020-08-17-custom-exception/