4.5.6.3. 다른 예외의 원인으로 One Exception을 지정합니다.

예외 번들 메서드에서 반환된 예외는 기본 원인으로 지정된 또 다른 예외를 가질 수 있습니다. 이 작업은 메서드에 매개 변수를 추가하고 @cause를 사용하여 매개 변수에 주석을 달아 수행됩니다. 이 매개변수는 원인 예외를 전달하는 데 사용되며 예외 메시지에서는 참조할 수 없습니다.

다음 절차에서는 원인인 예외를 나타내도록 @ causes 매개변수를 사용하여 예외 번들에서 메서드를 업데이트하는 방법을 보여줍니다. 이 기능을 추가하려는 예외 번들이 이미 생성되었다고 가정합니다.

  1. Throwable 또는 하위 클래스 유형의 매개 변수를 메서드에 추가합니다.

    @Message(id=328, value = "Error calculating: %s.")
    ArithmeticException calculationError(Throwable cause, String msg);
  2. @ causes 주석을 매개 변수에 추가합니다.

    import org.jboss.logging.annotations.Cause
    
    @Message(id=328, value = "Error calculating: %s.")
    ArithmeticException calculationError(@Cause Throwable cause, String msg);
  3. interface 메서드를 호출하여 예외 오브젝트를 가져옵니다. 가장 일반적인 사용 사례는 캡처된 예외를 원인으로 지정하여 캐치 블록에서 새로운 예외를 생성하는 것입니다.

    try
    {
       ...
    }
    catch(Exception ex)
    {
       throw ExceptionBundle.EXCEPTIONS.calculationError(
                                        ex, "calculating payment due per day");
    }

다음은 다른 예외의 원인으로 예외를 지정하는 예입니다. 이 예외 번들은 typeth meticException 의 예외를 반환하는 단일 메서드를 정의합니다.

@MessageBundle(projectCode = "TPS")
interface CalcExceptionBundle
{
    CalcExceptionBundle EXCEPTIONS = Messages.getBundle(CalcExceptionBundle.class);

    @Message(id=328, value = "Error calculating: %s.")
    ArithmeticException calcError(@Cause Throwable cause, String value);
}

다음 예제에서는 정수를 0으로 분할하려고 하므로 예외가 발생하는 작업을 보여줍니다. 예외가 해결되고 첫 번째 예외를 원인으로 사용하여 새로운 예외가 생성됩니다.

int totalDue = 5;
int daysToPay = 0;
int amountPerDay;

try
{
   amountPerDay = totalDue/daysToPay;
}
catch (Exception ex)
{
   throw CalcExceptionBundle.EXCEPTIONS.calcError(ex, "payments per day");
}

다음은 이전 예제에서 생성된 예외 메시지입니다.

Exception in thread "main" java.lang.ArithmeticException: TPS000328: Error calculating: payments per day.
    at com.company.accounts.Main.go(Main.java:58)
    at com.company.accounts.Main.main(Main.java:43)
Caused by: java.lang.ArithmeticException: / by zero
    at com.company.accounts.Main.go(Main.java:54)
    ... 1 more