JAVA Exception 정리
1. 예외란?(Error vs Exception)
- 먼저 오류(Error)와 예외(Exception)의 개념을 정리하고 넘어가자
오류(Error)
- java.langError 클래스의 서브 클래스들이다
- 시스템에 비정상적인 상황이 생겼을 때 발생한다.
- 주로 VM이 발생시킨다
- 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류
- 따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다
- OutofMemoryError나 ThreadDeath같은 에러는 catch로 잡아봤자 대응 방법이 없다
예외(Exception)
- 개발자가 구현한 로직에서 발생한다.
- 발생할 상황을 미리 예측하여 처리 할 수 있다
- 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따라 처리방법을 명확히 알고 있는것이 중요함
2. 예외 클래스
|
예외 클래스의 구조 |
- 모든 예외 클래스는 Throwable 클래스를 상속받고 있으며, Throwable은 최상위 클래스 Object의 자식 클래스이다
- Throwable을 상속받는 클래스는 Error와 Exception이 있다. Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 함
- 반면에 Exception은 개발자가 로직을 추가하여 처리 할 수 있음
- Excpetion은 수많은 자식 클래스를 가지고 있다.
- 그 중 RuntimeException에 주목해야 함
- RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준
- Exception의 자식 클래스 중 RuntimeException을 제외한 모든 클래스는 CheckedException
- RuntimeException과 그의 자식 클래스들을 Unchecked Exception이라 부름
3. Checked Exception과 Unchecked(Runtime) Exception
|
롤백: 데이터 베이스에서 업데이트가 발생할 때, 이전 상태로 되돌리는 것 |
- CE와 UE의 가장 명확한 기준은 "꼭 처리를 해야 하느냐"이다
- CE이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 함
- 반면 UE는 명시적인 예외처리를 하지 않아도 된다.
- UE는 피할 수 있지만 개발자가 부주의해서 발생하는 경우가 대부분
- 미리 예측하지 못했던 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리할 필요가 없음
4. 예외 처리 방법
예외 처리 방법 위의 그림 처럼 3가지가 있다
- 예의가 발생하면 다른 작업 흐름으로 유도하는 예외 복구
- 처리를 하지 않고 호출한 쪽으로 던져버리는 예외 처리 회피
- 호출한 쪽으로 던질 때 명확한 의미를 전달하기 위해 다른 예외로 전환하여 던지는 예외 전환
4.1. 예외 복구
- 예외 복구의 핵심은 예외가 발생하여도 애플리케이션은 정상적인 흐름으로 진행됨
- 위의 그림은 재시도를 통해서 예외를 복구하는 코드
4.2. 예외처리 회피
- 예외가 발생하면 throws를 통해 호출한쪽으로 예외를 던지고 그 처리를 회피
- 호출한 쪽에서 다시 예외를 받아 처리하도록 하거나, 해당 메소드에서 이 예외를 던지는 것이 최선의 방법이라는 확신이 있을때만 사용
4.3 예외 전환
- 예외를 잡아서 다른 예외를 던지는 것
- 호출한 쪽에서 예외를 받아서 처리할 때 좀 더 명확하게 인지할 수 있도록 돕기 위한 방법
- 어떤 예외인지 분명해야 처리가 수월해지기 때문
+ 초급 계발자가 하지 말아야 할 것
- 예외를 잡고 아무 처리도 하지 않는 것은 정말 위험
- ex) try/catch문으로 예외를 잡아놓고 catch를 비워두면 물론 컴파일 오류가 나지는 않겠지만, 예외가 발생했을 때 그 원인을 파악하기가 어려움
출처
댓글
댓글 쓰기