カスタム例外ハンドラーの設定

例外ハンドラーを設定して、ルール条件およびアクションでの例外処理をカスタマイズできます。 CustomExceptionHandler API を実装すると、例外を無視するか、再スローできます。 ルール・フローに固有のエレメントで発生する例外を処理するには、カスタムのルール・フロー例外ハンドラーを設定します。

このタスクについて

例外がスローされたとき、エンジンのデフォルトの動作は停止することです。 CustomExceptionHandler API を使用すると、例外処理をカスタマイズして、例外をキャッチしたり再スローしたり、例外の種類によるフィルタリングを行ったり、ログに記録したりすることができます。

CustomExceptionHandler のカスタム例外ハンドラー・サブクラスを設定し、次に挙げる専用メソッド handleConditionExceptionhandleActionException を使用することで、ルールの条件部分とアクション部分に対する例外処理をカスタマイズできます。

handleConditionException
ルールの条件部分での例外で、handleConditionException メソッドがトリガーされます。 このメソッドが呼び出されるときは、条件が解決されていないため、ルールのアクション部分が実行されません。 メソッドが例外を再スローする場合、エンジンが停止します。これはデフォルトの動作です。 メソッドが例外をキャッチし、例外を再スローしない場合、条件が未解決のままになります。 ただし、他のルールがある場合、エンジンはその処理を続行します。 自動例外処理がアクティブ化され、条件を解決できる場合、handleConditionException メソッドは呼び出されません。
handleActionException
ルールのアクション部分での例外では、常に handleActionException メソッドがトリガーされ、アクションの実行が停止します。 メソッドが例外を再スローする場合、エンジンが停止します。これはデフォルトの動作です。 メソッドが例外をキャッチし、例外を再スローしない場合、現在のアクションは終了しますが、実行されたとみなされます。 次に、他のルールがある場合、エンジンはその処理を続行します。

アクション・タスク本体、遷移条件、初期アクションと最終アクションの本体などの、ルール・フロー固有のエレメントで発生する例外も処理する必要がある場合、CustomRuleflowExceptionHandler API を実装し、メソッド handleRuleflowException を使用します。 このメソッドは、ルール・フローの任意の部分、または前に例外がキャッチされたことのないルール部分で例外が発生したときに呼び出されます。 メソッドへの呼び出しにより、ルールの実行のフローは変更されません。 メソッドで例外がキャッチされるか、再スローされると、例外が発生した時点で実行が停止します。

注: カスタム例外ハンドラーは、エンジンに直接アクセスできず、エンジンからアクセスすることもできません。 したがって、エンジンで検出されたパラメーターやその他の情報を参照することはできません。

クラシック・ルール・エンジンとの互換性については、 ディシジョン・エンジンのカスタム例外ハンドラを使用して例外をパラメータに格納する方法を参照してください。 外部リンクは新しいウィンドウまたはタブで開きます.

手順

  1. XOM で CustomExceptionHandler または CustomRuleflowExceptionHandler インターフェースを実装します。
  2. Rule Designerを開きます。
  3. 「ルール・プロジェクト・プロパティー」ウィンドウの 「ルール・エンジン」 パネルで、カスタム例外ハンドラー名を入力します。 例えば、 「カスタム例外ハンドラー」 フィールドに com.acme.MyCustomExceptionHandler と入力します。
  4. OK」をクリックします。

以下の例では、カスタム例外ハンドラーによって NumberFormatException の例外が再スローされます。

package com.acme;
import ...

public class MyCustomExceptionHandler implements CustomExceptionHandler {

  static Logger logger = Logger.getLogger(MyCustomExceptionHandler.class.getName());

  /**
   * The custom exception handler must contain a default constructor.
   */
  public MyCustomExceptionHandler() {
  }

  @Override
  public void handleConditionException(Exception e) throws Exception {
    if (e instanceof NumberFormatException) {
      // ignore number format exception
    } else {
      // rethrow the exception, it will stop the engine execution
      throw e;
    }
  }

  @Override
  public void handleActionException(Exception e, RuleInstance ruleInstance) throws Exception {
    if (e instanceof NumberFormatException) {
      // ignore number format exception and log
      if (logger.isLoggable(Level.INFO)) {
        logger.log(Level.INFO,
            "Exception while executing action of rule " + ruleInstance.getRuleName(), e);
      }
    } else {
      // rethrow the exception, it will stop the engine execution
      throw e;
    }
  }
}

次の例では、カスタムのルール・フロー例外ハンドラーがルール・フロー例外をログに記録します。

package com.acme;
import ...
public class MyCustomRuleflowExceptionHandler implements CustomRuleflowExceptionHandler
{
  static Logger logger = Logger.getLogger(MyCustomRuleflowExceptionHandler.class.getName());
  /**
  * The custom ruleflow exception handler must contain a default constructor.
  */

  public MyCustomRuleflowExceptionHandler() {
  }

  @Override
  public void handleRuleflowException(Exception e) throws Exception {
     if (logger.isLoggable(Level.INFO)) {
        logger.log(Level.INFO, "Exception in Ruleflow: " +  e.getMessage());
     }
  }

  @Override
  public void handleConditionException(Exception e) throws Exception {
    // your implementation
  }

  @Override
  public void handleActionException(Exception e, RuleInstance ruleInstance) throws Exception {
    // your implementation
  }

}