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