4.5.6.3. 将一个例外指定为 Another Exception 的 Cause of Exception
异常捆绑包方法返回的异常可能会有另一个例外指定为根本原因。这可以通过向方法添加 参数并使用 @Cause 标注 参数。此参数用于传递导致的异常,且无法在异常消息中引用。
下列步骤演示了如何使用 @Cause 参数 从异常捆绑包更新方法以指示导致的异常。假设您已创建了要添加此功能的异常捆绑包。
向方法添加类型为
可浏览或其子类的参数。@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);
添加
@Cause注释到 参数。import org.jboss.logging.annotations.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);
调用 interface 方法以获取异常对象。最常见的用例是从
catch块中抛出新的异常,并将捕获的异常指定为原因。try { ... } catch(Exception ex) { throw ExceptionBundle.EXCEPTIONS.calculationError( ex, "calculating payment due per day"); }
以下是将异常指定为另一例外的原因的示例。此异常捆绑包定义了一个返回类型 ArithmeticException 异常的方法。
@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);
}以下示例演示了引发异常的操作,因为它尝试将整数除以零。这个异常会被捕获,使用第一个异常作为原因创建新的异常。
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