Java 예외 처리 - 기본 규칙

예외는 수건 돌리기처럼 떠넘기기도 하다. 예외가 발생시 처리하거나 밖으로 또는 던져야 할 수 있다.


예외 처리 발생 상황

그림으로 살펴보자

정상 흐름

+-------+
| Main  |
+---+---+
    ↓ (1)
+---+-----+
| Service |
+----+----+
     ↓ (2)
+----+---+
| Client |
+--------+
  1. Main -> Service 정상적인 호출 흐름
  2. Service -> Client 정상적인 호출 흐름

던진 예외 처리

+-------+
| Main  |
+---+---+
    ↑ (6) 정상 흐름으로 반환
+---+-----+
| Service | (5) 예외 처리
+----+----+
     ↑ (4) 예외 Service 에게 전달
+----+---+
| Client | (3) 예외 발생
+--------+
  1. Client 단에서 예외가 발생
  2. Client 단에서 예외 처리가 불가하여 자신을 호출한 Service 에게 던진다.
  3. Service 는 전달 받은 예외를 처리한다.
  4. 애플리케이션은 Main 에게 정상 흐름으로 반환한다.

던진 예외 처리 불가

+-------+
| Main  |
+---+---+
    ↑ (6) 예외 Main 에게 전달
+---+-----+
| Service | (5) 예외 처리 불가
+----+----+
     ↑ (4) 예외 Service 에게 전달
+----+---+
| Client | (3) 예외 발생
+--------+

위 상황과 같지만 Service가 예외를 처리를 못하여 호출한 Main에게 예외를 던진 상황이다.

예외에 대한 2가지 규칙

앞서 그림으로 살펴본 것 같이 기본 규칙을 알고 있자.

  • 예외는 처리하거나 밖으로 던져야 한다.(밖이란? 자신을 호출한 스택)
  • 예외를 처리하거나 던질 때는 지정한 예외 뿐 아니라 그 자식들도 함께 처리한다.
    • Exception catch 로 잡은 경우 그 하위 예외들은 모두 처리할 수 있어야 한다.
    • Exception throws 로 던진 경우 그 하위 예외들은 모두 던질 수 있어야 한다.

만약 모든 호출한 쪽에서 모두 처리하지 못하고 던지는 경우 어떻게 될까?

  • 자바의 시작점 main() 엔트리 포인트가 처리하지 못하면 예외 로그를 발생시키고 시스템이 종료된다.