[JAVA] Error와 Exception
오류(Error)와 예외(Exception) 개념
오류(Error)
오류(Error)란 시스템에 비정상적인 상황이 생겼을 경우를 뜻한다. 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다. 개발자가 미리 예측하여 처리할 수 없기 때문에, 오류에 대한 처리를 신경 쓰지 않아도 된다.
예외(Exception)
예외(Exception)란 개발자가 구현한 로직에서 발생한 경우를 뜻한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다.
자료 : https://okky.kr/article/362305
모든 예외 클래스들은 Throwable 클래스를 상속 박고 있고, Throwable 클래스는 Object의 자식 클래스이다.
Throwable 클래스를 상속받는 클래스는 Error와 Exception이고, Error는 위에서 말했듯이 심각한 수준의 에러이기 때문에 시스템에 변화를 주어야하고, Exception은 개발자가 로직을 추가하여 처리할 수 있다.
Checked Exception/Unchecked(Runtime) Exception
Checked Exception
- 반드시 예외를 처리해야하는 Exception
- 컴파일 단계에서 확인할 수 있음
- Roll-back 하지 않음
- IOException, SQLException, …
UnChecked Exception
- 명시적인 처리를 강제하지 않음
- 실행단계에서 알 수 있음
- Roll-back 진행
- NullPointerException, IllegealArgumentException, IndexOutOfBoundException, …
그렇다면, Checked와 Unchecked를 구분하는 방법은 무엇일까?
그것은 ‘꼭 처리를 해야 하는가?‘이다. Checked Exception이 발생할 가능성이 있는 메소드라면 반드시 로직을 처리해야 하고, UnChecked Exception은 명시적인 예외처리를 하지 않아도 된다.
또한, 컴파일 단계에서 구분할 수 있는데, 컴파일 단계에서 확인 가능하다면 Checked Exception, 실행과정 중에 발견되면 UnCheckedException이다. 그래서 Runtime Exception이라고 부른다.
Rollback 여부
Checked Exception은 예외가 발생하면 roll-back하지 않고 예외를 던져주는데, Unchecked Exception은 roll-back을 진행한다.
예외 처리
예외 복구
- 다른 작업 흐름으로 유도하는 방법
- 예외가 발생하여도 정상적인 흐름으로 진행
try {
//예외 발생지점
} catch(IllegalArgumentException e) {
//예외 복구
}
예외 회피
- 처리하지 않고 호출한 곳으로 예외를 던짐
- 호출한 쪽에서 다시 예외를 받아 처리하도록 하거나, 이 예외를 던지는 것이 최선이라고 판단할 때 사용
public void divide() throws ArithmeticException {
// 구현 로직
}
예외 전환
- 명확한 의미의 예외로 전환 후 던짐
- 예외를 잡아서 다른 예외를 던지는 것
- 좀 더 명확한 예외를 던짐으로써 처리하기 수월 해짐
try {
//예외 발생지점
} catch(RuntimeException e) {
throw new DuplicateException();
}
가장 중요한 것은 try/catch로 잡아 놓고 아무 것도 하지 않거나 무지성으로 throw 하는 일음 삼가토록 하자.