Throwable の処理 - Mule 4

Java Module は、Throwable インスタンスに有益な DataWeave 関数を公開します。 (Java では、Throwable は ​throw​ ステートメントです)。

これらの関数は DataWeave バージョン 1.2.0 以降で使用可能になりました。

原因の確認

isCausedBy​ 関数を使用して、Throwable の原因が特定の種別の例外であったのかどうかを確認できます。これは、​エラーハンドラー​にロジックを追加するときに特に役立ちます。

package com.me;

public class TaxCalculator {

	public Double calculateTax(Double price) {
		if (price == null) {
			throw new NullPointerException("Must provide a value for price");
		}
		if (price < 0) {
			throw new IllegalArgumentException("Price must be a non-negative value, but was: " + price);
		}
		return price * 0.21;
	}
}

calculateTax(Double price)​ メソッドは、​IllegalArgumentException​ および ​NullPointerException​ 例外を宣言します。

次のコード例は、​invoke​ 操作​の実行中にエラーをスローするフローの部分をリストします。

calculateTax(Double price)​ メソッドの失敗した呼び出し中に発生した Java 例外を確認するには、エラーハンドラーで ​isCausedBy​ 関数を使用して、ケースごとに異なるロジックを追加します。

<java:new class="com.me.TaxCalculator"
	constructor="TaxCalculator()"
	target="taxCalculator"/>
<java:invoke instance="#[vars.taxCalculator]"
	class="com.me.TaxCalculator"
	method="calculateTax(Double)">
    <java:args>#[{price: payload.price}]</java:args>
</java:invoke>
<error-handler>
    <on-error-continue
    	when="#[Java::isCausedBy(error.cause, 'java.lang.IllegalArgumentException')]">
        <set-payload value="Negative prices are not allowed."/>
    </on-error-continue>
    <on-error-continue
    	type="#[Java::isCausedBy(error.cause, 'java.lang.NullPointerException')]">
        <set-payload value="There is no price."/>
    </on-error-continue>
</error-handler>

根本原因の取得

getRootCause​ 関数は、例外のラップとは関係のない Throwable の根本原因を取得します。

次の例では、税額計算のエラーはすべて、Throwable の根本原因を取得する ​handle(Throwable)​ メソッドが含まれる ​FailureHandler​ クラスで処理されます。それを可能にするため、​getRootCause​ 関数を使用して、根本原因を ​handle(Throwable)​ メソッドに引数として渡すことができます。

<java:new class="com.me.TaxCalculator"
  constructor="TaxCalculator()"
  target="taxCalculator"/>
<java:invoke instance="#[vars.taxCalculator]"
  class="com.me.TaxCalculator"
  method="calculateTax(Double)">
    <java:args>#[{price: payload.price}]</java:args>
</java:invoke>
<error-handler>
    <on-error-continue>
      <java:invoke-static
      	class="com.me.FailureHandler"
	method="handle(Throwable)">
          <java:args>#[{cause: Java::getRootCause(error.cause)}]</java:args>
      </java:invoke-static>
    </on-error-continue>
</error-handler>