Java 예외 처리 - 기본 규칙
예외는 수건 돌리기처럼 떠넘기기도 하다. 예외가 발생시 처리하거나 밖으로 또는 던져야 할 수 있다.
예외 처리 발생 상황
그림으로 살펴보자
정상 흐름
+-------+
| Main |
+---+---+
↓ (1)
+---+-----+
| Service |
+----+----+
↓ (2)
+----+---+
| Client |
+--------+
- Main -> Service 정상적인 호출 흐름
- Service -> Client 정상적인 호출 흐름
던진 예외 처리
+-------+
| Main |
+---+---+
↑ (6) 정상 흐름으로 반환
+---+-----+
| Service | (5) 예외 처리
+----+----+
↑ (4) 예외 Service 에게 전달
+----+---+
| Client | (3) 예외 발생
+--------+
- Client 단에서 예외가 발생
- Client 단에서 예외 처리가 불가하여 자신을 호출한 Service 에게 던진다.
- Service 는 전달 받은 예외를 처리한다.
- 애플리케이션은 Main 에게 정상 흐름으로 반환한다.
던진 예외 처리 불가
+-------+
| Main |
+---+---+
↑ (6) 예외 Main 에게 전달
+---+-----+
| Service | (5) 예외 처리 불가
+----+----+
↑ (4) 예외 Service 에게 전달
+----+---+
| Client | (3) 예외 발생
+--------+
위 상황과 같지만 Service가 예외를 처리를 못하여 호출한 Main에게 예외를 던진 상황이다.
예외에 대한 2가지 규칙
앞서 그림으로 살펴본 것 같이 기본 규칙을 알고 있자.
- 예외는 처리하거나 밖으로 던져야 한다.(밖이란? 자신을 호출한 스택)
- 예외를 처리하거나 던질 때는 지정한 예외 뿐 아니라 그 자식들도 함께 처리한다.
- Exception catch 로 잡은 경우 그 하위 예외들은 모두 처리할 수 있어야 한다.
- Exception throws 로 던진 경우 그 하위 예외들은 모두 던질 수 있어야 한다.
만약 모든 호출한 쪽에서 모두 처리하지 못하고 던지는 경우 어떻게 될까?
- 자바의 시작점 main() 엔트리 포인트가 처리하지 못하면 예외 로그를 발생시키고 시스템이 종료된다.