6.2.5.3. 別の例外の原因として 1 つの例外を指定
例外バンドルメソッドより返された例外に対し、他の例外を基礎となる原因として指定することができます。指定するには、パラメーターをメソッドに追加し、パラメーターに
@Cause
アノテーションを付けます。このパラメーターは、原因となる例外を渡すために使用されます。このパラメーターは、例外メッセージでは参照できません。
次の手順は、
@Cause
パラメーターを使用して原因となる例外を示し、例外バンドルよりメソッドを更新する方法を表しています。この機能に追加したい国際化された例外バンドルがすでに作成されていることを前提とします。
手順6.12 別の例外の原因として 1 つの例外を指定
パラメーターを追加します。
タイプのパラメーターを追加しますThrowable
またはメソッドのサブクラス。@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);
アノテーションを追加します。
追加します@Cause
パラメーターへの注釈。import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);
メソッドを呼び出します。
例外オブジェクトを取得するため、インターフェースメソッドを呼び出します。catch ブロックから新しい例外を発生させ、キャッチした例外を原因として使用するのが最も一般的なユースケースです。try { ... } catch(Exception ex) { throw ExceptionBundle.EXCEPTIONS.calculationError( ex, "calculating payment due per day"); }
例6.6 別の例外の原因として 1 つの例外を指定
この例外バンドルでは、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