개발자는 기록이 답이다

Exception Wrapping vs Rethrowing 본문

언어/Java

Exception Wrapping vs Rethrowing

slow-walker 2024. 3. 25. 14:03

 

Baeldung에 올라온 포스팅을 한글로 번역한 글입니다.


Java의 throw 키워드는 사용자 정의 예외 혹은 내장 예외를 명시적으로 발생시키는데 사용됩니다.

하지만 때로는 catch블록에서 동일한 예외를 다시 발생시켜야 할때도 있고, 이로 인해 예외가 다시 발생합니다.

 

1. Rethrowing Exceptions

 

때로는 예외를 더 높은 수준으로 전파하기 전에 몇 가지 수행해야 할 것이 있습니다.

예를 들어 DB트랜잭션을 롤백하거나 예외를 기록하거나 이메일을 보낼 수 있습니다.

 

catch블록에서 이러한 활동을 수행하고 예외를 다시 발생시킬 수 있습니다. 이러한 방식으로 시스템에서 예외가 발생했음을 상위레벨에 알립니다.

 

예시를 들어보면, 아래 코드에서는 동일한 예외가 다시 발생합니다. 그리고 오류 메세지가 발생하기 직전에 오류 메세지를 기록합니다.

String name = null;

try {
    return name.equals("Joe"); // causes NullPointerException
} catch (Exception e) {
    // log
    throw e;
}

 

그리고 콘솔에는 다음 메세지가 표시됩니다.

Exception in thread "main" java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)

 

보다시피, 코드는 포착한 모든 예외를 다시 발생시키고, 이로 인해 저희는 아무런 변경없이 원본  stack trace를 얻습니다.

 

2. Wrapping Exceptions

예외 래핑의 경우 다른 예외 생성자의 참조와 동일한 예외를 전달합니다.

String name = null;

try {
    return name.equals("Joe"); // causes NullPointerException
} catch (Exception e) {
    // log
    throw new IllegalArgumentException(e);
}

 

그리고 콘솔에는 다음 메세지가 표시됩니다.

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24)
Caused by: java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18)

 

이번에는 래핑된 예외 뿐만 아니라 원래 예외까지 살펴볼 수 있습니다.

 이러한 방식으로 IllegalArguemntException 인스턴스는 원래 NullPointException을 원인으로 래핑합니다.

따라서 일반적인 예외를 표시하는 대신 보다 구체적인 예외를 표시할 수 있습니다.

 

결론

  • 2가지 방법 모두 예외 메세지를 표시하는 방식이 서로 다릅니다.
  • 요구 사항에 따라 동일한 예외를 다시 발생시키거나, 2번째 접근 방식을 사용해서 특정 예외로 래핑할 수 있습니다.
  • 2번째 방식이 더 깔끔해보이고 예외를 역추적하기 쉽습니다.