JAVA

예외 처리가 생겨나게 된 이유

현대의 서비스들은 외부 서버와의 연결, 네트워크 통신 등 많은 부분들을 서로 연계하여 만들어진다. 그로인해 발생되는 많은 예외들을 어떻게 처리해야 할 것인가는 매우 중요하다.

예외 처리 기법이 생겨나기 전의 처리

  • 반환 값으로 예외 처리 오류가 발생했을 때 직접 값을 반환해 처리하는 방식 ex) “success”, “false”

    해당 방식은 수많은 수많은 if문들의 중첩으로 정상 흐름과 예외흐름이 겹쳐 있어, 중요한 정상 흐름을 알아보기가 쉽지 않다.

예외 계층

자바는 예외를 처리하기 위한 매커니즘을 제공한다.

  • keyword : try, catch, finally, throw, throws

체크 예외와 언체크 예외의 분기

예외는 폭탄과 같고 잡아서 처리하거나 계속 던져버려야 한다.

  1. 체크 예외 (Exception)
    • 잡아서 처리하는 경우 ( throw - 생략 X ) 장점 - 개발자가 누락하지 않고 어디서 예외가 발생하는지 파악하기 쉬움 - 컴파일러가 누락된 부분을 잡아줄 수 있음 단점 - 모든 예외를 반드시 처리해야 하기 때문에 너무 번거로워 진다.
  2. 언체크 예외 (RuntimeException)
    • 던져서 처리하는 경우 ( throws - 생략 O )

    • 상위로 계속 폭탄을 던져냄 장점 - 신경쓰고 싶지 않은 예외는 무시가능 단점 - 실수로 예외를 누락할 확률이 있다.

예외의 계층화

예외를 단순히 코드를 분리해 처리하는 것이 아닌, 계층화 하여 더 세밀하게 예외를 분류하고 처리할 수 있다.

바람직한 예외 처리와 실무

  1. 정상 흐름과 예외 흐름을 나눈다.
  2. 반드시 실행되어야하는 로직 수행 가능
    • 리소스 반납

모든 예외를 체크로 처리할 경우 예외 처리 지옥에 빠질 가능성이 농후하다.

또한, 예외를 잡아서 복구할 수 있는 예외보다 복구할 수 없는 예외가 더 많다.

매우 중요한 쪽은 체크 예외로 처리하고, 대부분은 언체크 예외로 둔다.

예외를 공통으로 처리하는 것이 바람직한 방향 세부 로직에선 언체크로 수행하고, 서비스 메인단에서 오류를 받아서 처리한다. ex) main 메서드에서 ExceptionHandler를 이용하여 오류를 한꺼번에 받고, 필요한 오류들만 별도로 처리하는 방식

try-with-resources

AutoCloseable ( Interface )를 구현하면 try 가 끝나는 시점에 close()를 자동으로 실행한다.

public interface AutoCloseable {
	void close() throws Exception;
}

구문

try (Resource resource = new Resource()) {
	// 리소스를 사용하는 코드
}
  • finally 보다도 더 빨리 실행