시스템이 예상치 못한 상황에서도 안정적으로 동작하도록 하기 위해 예외 처리는 필수적이다.
예외 처리를 하는 경우에 정상 흐름과 예외 흐름을 구분하는 것이 중요하다. 이것들을 구분하지 않으면 코드가 복잡하고 이해하기 어려워진다.
client.connect();
client.send(data);
client.disconnect();
String connectResult = client.connect();
if (isError(connectResult)) {
System.out.println("[Network Error] Error Code: " + connectResult);
} else {
String sendResult = client.send(data);
if (isError(sendResult)) {
System.out.println("[Network Error] Error Code: " + sendResult);
}
}
예외 처리 메커니즘을 이용하면 정상 흐름과 예외 흐름을 명확히 분리할 수 있다.
try
catch
finally
throw
throws
예외도 객체이다.
(출처: 김영한의 실전 자바 - 중급 1편)
Error
: 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구가 불가능한 시스템 예외Exception
RuntimeException
은 아님RuntimeException
Exception
을 catch
로 잡으면 하위 예외들도 모두 잡을 수 있음Exception
을 throws
로 던지면 하위 예외들도 모두 던질 수 있음예외를 계속 던지면?
- 자바 애플리케이션의 main() 쓰레드에서는 예외를 계속 던지면 애플리케이션이 종료된다. 예외 스택 트레이스(로그)가 출력되며, 프로그램이 비정상적으로 종료된다.
- 웹 애플리케이션에서는 전체 시스템의 안정성이 저하될 수 있으므로, 예외를 잡아 처리하고 사용자에게 적절한 오류 페이지를 제공하여 시스템이 정상적으로 운영되도록 보장한다.
예외 처리하는 경우
① Main
은 Service
호출
② Service
는 Client
호출
③ Client
에서 예외 발생
④ Client
에서 예외를 처리하지 못하고 밖(Client
가 호출한 Service
)으로 던짐
⑤ Service
에 예외 전달되고 예외 처리
⑥ 정상 흐름 반환
예외 던지는 경우
① Main
은 Service
호출
② Service
는 Client
호출
③ Client
에서 예외 발생
④ Client
에서 예외를 처리하지 못하고 밖(Client
가 호출한 Service
)으로 던짐
⑤ Service
에서 처리하지 못하고 Main
으로 던짐