Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 예외를 다시 던지는(Rethrow) 방법과 활용 예제

Java 프로그래밍을 하다 보면 catch 블록에서 잡은 예외를 그 자리에서 처리하지 못하고, 상위 호출자에게 처리를 위임해야 하는 경우가 종종 발생합니다. 이럴 때 사용하는 것이 바로 예외 다시 던지기(Rethrow)입니다.

catch 블록이 잡은 예외를 적절히 처리할 수 없다면, 해당 예외를 다시 throw하여 원래 던져졌던 객체를 그대로 상위로 전달할 수 있습니다. 다시 던져진 예외는 현재 스코프의 catch 블록이 아닌, 바깥쪽에 있는 try 블록으로 전달되며, 그곳의 catch 블록들이 예외를 처리할 기회를 갖게 됩니다.

기본 문법

예외를 다시 던지는 방법은 매우 간단합니다. catch 블록 안에서 이미 잡은 예외 객체를 그대로 throw하면 됩니다.

catch(Exception e) {
    System.out.println("An exception was thrown");
    throw e;
}

동작 방식

  • rethrow 표현식이 실행되면 원래 던져졌던 예외 객체가 그대로 다시 던져집니다.
  • 이미 해당 스코프에서 예외가 잡혔기 때문에, 같은 스코프 내의 다른 catch 블록은 이 예외를 처리할 수 없습니다.
  • 예외는 바깥쪽(상위) try 블록으로 전파되며, 그곳의 catch 블록들이 순서대로 예외를 처리할 기회를 얻습니다.

예제 코드

아래 예제는 test1() 메서드에서 발생한 예외가 test2() 메서드에서 잡힌 뒤 다시 던져지고, 최종적으로 main() 메서드에서 처리되는 과정을 보여줍니다.

public class RethrowException {
    public static void test1() throws Exception {
        System.out.println("The Exception in test1() method");
        throw new Exception("thrown from test1() method");
    }
    public static void test2() throws Throwable {
        try {
            test1();
        } catch(Exception e) {
            System.out.println("Inside test2() method");
            throw e;
        }
    }
    public static void main(String[] args) throws Throwable {
        try {
            test2();
        } catch(Exception e) {
            System.out.println("Caught in main");
        }
    }
}

실행 결과

The Exception in test1() method
Inside test2() method
Caught in main

실행 흐름 분석

  1. test1(): 예외를 생성하여 던집니다.
  2. test2(): test1()에서 던진 예외를 catch한 후, 로그를 남기고 같은 예외를 다시 던집니다(rethrow).
  3. main(): test2()에서 다시 던져진 예외를 최종적으로 catch하여 처리합니다.

이처럼 예외 다시 던지기를 활용하면 중간 계층에서 로깅이나 부가 작업을 수행하면서도, 실제 예외 처리 책임은 상위 계층에 맡길 수 있어 코드 구조가 깔끔해집니다.