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

Java의 fillInStackTrace() 메서드란? 언제, 왜 사용해야 할까?

Java에서 fillInStackTrace() 메서드는 Throwable 클래스에 속한 중요한 메서드입니다. 스택 트레이스(stack trace)는 예외가 정확히 어느 지점에서 발생했는지 파악하는 데 유용한 정보를 제공합니다.

그런데 실제 개발 과정에서는 예외를 잡은 후 다시 던지는(재던지기, rethrow) 상황이 자주 발생합니다. 이때 기존 스택 트레이스를 그대로 두면 예외가 최초 발생한 위치만 보여주기 때문에, 예외가 어디에서 다시 던져졌는지 알기 어렵습니다. 바로 이런 경우에 fillInStackTrace() 메서드를 활용하면 현재 시점의 호출 스택으로 스택 트레이스를 새로 기록해 재던져진 위치까지 정확하게 추적할 수 있습니다.

메서드 선언(문법)

public Throwable fillInStackTrace()

이 메서드는 호출되는 순간의 스레드 스택 상태를 캡처하여 현재 Throwable 객체에 새로운 스택 트레이스 정보로 채워 넣고, 해당 객체 자신(this)을 반환합니다.

사용 예제

public class FillInStackTraceTest {
    public static void method1() throws Exception {
        throw new Exception("This is thrown from method1()");
    }
    public static void method2() throws Throwable {
        try {
            method1();
        } catch(Exception e) {
            System.err.println("Inside method2():");
            e.printStackTrace();
            throw e.fillInStackTrace(); // fillInStackTrace() 메서드 호출
        }
    }
    public static void main(String[] args) throws Throwable {
        try {
            method2();
        } catch (Exception e) {
            System.err.println("Caught Inside Main method()");
            e.printStackTrace();
        }
    }
}

실행 결과

Inside method2():
java.lang.Exception: This is thrown from method1()
        at FillInStackTraceTest.method1(FillInStackTraceTest.java:3)
        at FillInStackTraceTest.method2(FillInStackTraceTest.java:7)
        at FillInStackTraceTest.main(FillInStackTraceTest.java:18)
Caught Inside Main method()
java.lang.Exception: This is thrown from method1()
        at FillInStackTraceTest.method2(FillInStackTraceTest.java:12)
        at FillInStackTraceTest.main(FillInStackTraceTest.java:18)

결과 분석

위 출력 결과를 보면 흥미로운 차이점을 확인할 수 있습니다.

첫 번째 출력(method2 내부): 예외가 최초로 발생한 시점의 스택 트레이스가 출력됩니다. 따라서 method1()의 3번째 줄에서 예외가 던져졌음을 알 수 있습니다.

두 번째 출력(main 메서드): fillInStackTrace()가 호출된 이후에는 스택 트레이스가 새롭게 다시 작성되었습니다. 그 결과 최초 발생 지점인 method1()의 정보는 사라지고, 예외가 재던져진 method2()의 12번째 줄부터 스택이 기록된 것을 볼 수 있습니다.

정리

  • fillInStackTrace()는 호출 시점의 현재 스레드 스택을 기준으로 스택 트레이스를 초기화합니다.
  • 예외를 재던질 때 원래 발생 위치가 아닌 재던진 위치를 추적하고 싶다면 이 메서드를 사용하면 됩니다.
  • 반대로 원본 예외의 발생 지점을 그대로 유지하고 싶다면 throw e;처럼 그냥 재던지거나, 예외 체이닝(cause)을 활용하는 것이 좋습니다.