자바 예외 (Exception)
JAVA ·예외 계층
- Object : 예외도 객체이므로, 예외의 최상위 부모 역시 Object
- Throwable : 최상위 예외
- Error : 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외
- Exception : 체크 예외
- 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외
- Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외
단, RuntimeException은 예외
- RuntimeException : 언체크 예외, 런타임 예외
- 컴파일러가 체크하지 않는 언체크 예외
- 자식들도 모두 언체크 예외
예외 기본 규칙
- 예외는 잡아서 처리하거나 던져야 한다.
- 예외를 잡거나 던질 때 지정한 예외뿐만 아니라 그 예외의 자식들도 함께 처리된다.
체크 예외
- Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외
- 단, RuntimeException은 예외
- 체크 예외는 잡아서 처리하거나, 또는 밖으로 던지도록 선언해야 한다.
그렇지 않으면 컴파일 오류가 발생한다. - 장점 : 개발자가 실수로 예외를 누락하지 않도록
컴파일러를 통해 문제를 잡아주는 훌륭한 안전 장치 - 단점 : 모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에
너무 번거롭고 의존관계에 따른 단점도 있음- SQLExcpetion에 의존하면 향후 JDBC가 아닌 다른 기술로 변경시에
의존했던 모든 곳에 수정이 필요해짐
- SQLExcpetion에 의존하면 향후 JDBC가 아닌 다른 기술로 변경시에
언체크 예외
- RuntimeException과 그 하위 예외는 언체크 예외로 분류
- 말 그대로 컴파일러가 예외를 체크하지 않는다는 뜻
- 체크 예외와 차이는 throws를 생략 가능, 자동으로 예외 던짐
- 장점 : 신경쓰고 싶지 않은 언체크 예외를 무시할 수 있고,
예외의 의존관계를 참조하지 않아도 된다. -
단점 : 실수로 예외를 누락할 수 있다.
예외 활용
- 기본적으로 언체크(런타임) 예외를 사용
- 시스템에서 발생한 예외는 대부분 복구 불가능한 예외이기에
런타임 예외를 사용하면 신경쓰지 않아도 됨 - 런타임 예외도 필요하면 잡을 수 있고, 그렇지 않으면 예외를
공통으로 처리하는 부분을 앞에 만들어서 처리하면 됨
- 시스템에서 발생한 예외는 대부분 복구 불가능한 예외이기에
- 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용
- 해당 예외를 잡아서 반드시 처리해야 하는 문제일 때 사용
- 예) 계좌 이체 실패 예외, 결제 포인트 부족 예외 등
-
예외를 전환할 때는 꼭! 기존 예외를 포함하자