intra-mart Accel Platform IM-LogicDesigner チュートリアルガイド 第12版 2023-10-01

5.7. ロジックフローのエラーハンドリング

この章では、ロジックフローにおいてエラーハンドリングを行う方法を説明します。

5.7.1. ロジックフローのエラーハンドリングとは

ロジックフローのエラーハンドリングは大別して以下の二つに分類されます。
  • エレメントでエラーが発生した場合、以降の処理を継続するかを決定する(エラー発生時のハンドリング)。
  • 自身より前に処理が行われたエレメントのエラー状況をもとに、自身の振る舞いを制御する(エラー発生後のハンドリング)。
この章では、上記の分類をもとに以下の説明を行います。
  • エラー発生時のハンドリング - エレメントに対するエラーハンドリングの設定方法。
  • エラー発生後のハンドリング - 受け取ったエラー状況(IM-LogicDesignerではこれを処理結果情報と呼びます)をもとに振る舞いを変更する方法。

5.7.2. エラーハンドリングの設定、および、動作確認

ここでは、エラー発生時のハンドリングの設定方法の説明と、動作の違いの確認を行います。
具体的にはエレメントに対して、処理中にエラーが発生した場合に以下の二通りのエラー処理のどちらを選択するかを設定します。
  • 処理を継続する
  • フロー全体のエラーとして処理を中断する
そして、それぞれにおいてどのように動作が異なるかを実際にエラーを発生させて確認します。

コラム

エラー処理フローによるエラーハンドリング

2023 Autumn(Hollyhock) からフロー実行中にエラーが発生した場合に実行するエラー処理フローを定義できるようになりました。
設定方法の詳細は「IM-LogicDesigner ユーザ操作ガイド」-「エラー処理フローを定義する」を参照してください。

5.7.2.1. フローの準備

はじめに、エラーハンドリングが行われることを確認するため、エラーが発生する簡単なロジックフローを準備します。
  1. 「サイトマップ」→「LogicDesigner」→「フロー定義一覧」から、ロジックフロー定義一覧を開きます。
    ロジックフロー定義一覧画面左上の「ロジックフロー新規作成」をクリックします。
  2. 「ユーザプロファイルの取得」タスク(IM共通マスタ)をフロー編集画面に追加し、以下のエレメント間に線を引きます。

    • 「開始」制御要素から「ユーザプロファイルの取得」タスク
    • 「ユーザプロファイルの取得」タスクから「終了」制御要素
    ../../../_images/setting_flow1.png

    図:ロジックフロー配線例

  3. ロジックフローを以下のとおりに保存します。

    • フロー定義ID「tutorial_error_handling

    • フロー定義名
      • 標準 - 「チュートリアルエラーハンドリング
      • 日本語、英語、中国語(中華人民共和国) - 入力なし
    • フローカテゴリ
      • ID - 「tutorial_category
      • 名称 - 「チュートリアルカテゴリ」
    ../../../_images/setting_flow2.png

    図:ロジックフローの保存

以上で、フローの準備が完了しました。

コラム

今回準備したフローについて

今回準備したフローでは、「ユーザプロファイルの取得」タスクを実行する上で必須パラメータであるユーザコードを指定していません。
そのため、このフローを実行した場合必ずエラーが発生します。

5.7.2.2. デフォルトの動作を確認する

次に、デフォルトでのエラー発生時のハンドリングを確認します。
IM-LogicDesignerではエレメントの処理中にエラーが発生した場合、デフォルトの動作として「フロー全体のエラーとして処理を中断」します。
今回の動作確認は発生したエラーも含めて確認していくため、デバッグ機能を利用します。
デバッグ機能の詳細な利用方法については「ロジックフローのデバッグ」を参照してください。
  1. ロジックフロー定義編集画面上部、ヘッダ内の「デバッグ」をクリックし、デバッグ画面を表示します。

    ../../../_images/setting_check_default1.png

    図:デバッグ画面

  2. デバッグ画面上部、ヘッダ内の「実行」をクリックし、デバッグ実行を行います。

    ../../../_images/setting_check_default2.png

    図:デバッグ実行

  3. 「ユーザプロファイルの取得」タスク実行時にエラーが発生し、ロジックフローが異常終了することを確認してください。

    ../../../_images/setting_check_default3.png

    図:デバッグ実行結果(異常終了)

以上で、エラー発生時のデフォルトのハンドリングが確認できました。

5.7.2.3. エラーハンドリングの設定を行う

次に、エラーハンドリングの設定を行います。
エラーハンドリングの設定は、エレメントのプロパティから行います。
  1. デバッグ画面を開いている場合は、デバッグ画面を閉じます。

  2. 「ユーザプロファイルの取得」タスクをクリックし、プロパティ画面を表示します。

    ../../../_images/setting_handling1.png

    図:「ユーザプロファイルの取得」タスクのプロパティ画面

  3. タスク固有設定の項目を以下のとおりに変更します。

    • エラーでも処理を継続する - チェックボックス:オン
    ../../../_images/setting_handling2.png

    図:エラーハンドリングの設定

  4. ロジックフローを保存します。

以上で、エラーハンドリングの設定が完了しました。
この設定により、「ユーザプロファイルの取得」タスクで処理中にエラーが発生した場合にも処理が継続されるようになりました。

5.7.2.4. エラーハンドリング設定後の動作を確認する。

最後に、設定したエラーハンドリングの動作を確認します。
確認は「デフォルトの動作を確認する」と同じくデバッグ機能から行います。
  1. ロジックフロー定義編集画面上部、ヘッダ内の「デバッグ」をクリックし、デバッグ画面を表示します。

  2. デバッグ画面上部、ヘッダ内の「実行」をクリックし、デバッグ実行を行います。

  3. 「ユーザプロファイルの取得」タスク実行時にエラーが発生しますが、ロジックフローが「正常に終了」したことを確認してください。

    ../../../_images/setting_check_again1.png

    図:デバッグ実行結果(正常終了)

これは、「ユーザプロファイルの取得」タスクでエラーが発生した場合でも、次のエレメント(「終了」制御要素)へ処理が渡ったことを表しています。
以上で、エラーハンドリングの動作が確認できました。

注意

エラー発生後の動作について

IM-LogicDesignerのエラー発生時のハンドリング(エラーでも処理を継続するプロパティ)は、あくまで「エラーが発生した場合でも次に処理を進めるハンドリング」であることに注意してください。
エラーの発生したエレメントから本来得られるはず情報(今回であればユーザプロファイル)を以降のタスクで利用していた場合、 以降のタスクでも連鎖的にエラーが発生する可能性が考えられます。

そのため本章で説明したエラーハンドリングは、エレメントにおいてエラーが発生しても後続の処理に影響を与えない場合のみ設定するか、次章の「処理結果情報の利用方法、および、動作確認」を参照し、適切な処理の振り分けを行うフローを定義した上で利用してください。

5.7.3. 処理結果情報の利用方法、および、動作確認

ここでは、エラー発生後のハンドリングを行うために、処理結果情報の詳細と利用方法を説明します。
具体的にはエレメントの処理結果情報にはどの様な内容が含まれているかを説明します。
そして、処理結果情報を利用した異なる振る舞いを行うフローを作成、動作確認します。

5.7.3.1. 処理結果情報の詳細

はじめに、エレメントの処理結果情報の詳細について説明します。
エレメントの処理結果情報は暗黙的な変数の一つとして利用可能です。

コラム

暗黙的な変数について

暗黙的な変数についての詳細、および、利用方法は「暗黙的な変数の利用」を参照してください。
処理結果情報は以下の要素から構成されます。
プロパティ名 詳細
error<boolean>
エレメントの処理がエラーだった場合trueが指定されます。
エレメントの処理が正常に終了した場合はfalseが指定されます。
errorMessage<string>
エラー発生時のエラーメッセージが指定されます。
エレメントの処理が正常に終了した場合はnullが指定されます。
errorReport<string>
エラー発生時のエラー詳細が指定されます。
エラー詳細に含まれる情報以下の通りです。
  • エラー発生日時
  • エラーメッセージ
  • エレメントの実行ID
  • スレッドID
  • リクエストID
  • 実行ユーザ
  • 呼び出しURL
  • フロー呼び出しパラメータ
  • タスク実行時パラメータ
  • 例外スタックトレース
※エラー発生箇所により値が取得できない項目は nullが設定されます。
executeId<string>
この処理結果情報が紐づくエレメントの実行IDが指定されます。
stackTrace<string>
エラー発生時の例外スタックトレースが指定されます。
また、処理結果情報には利用するにあたって考慮すべき仕様があります。
それは、処理結果情報は「参照するエレメントの一つ前のエレメントの情報」を返すという点です。
例えば、同じ暗黙的な変数である「セッション情報」は、どのエレメントから参照しても同じ振る舞いの値を返します。
../../../_images/example1.png

図:セッション情報は全エレメントで同じ振る舞いの値を参照する。

しかし、処理結果情報は参照するエレメントによって取得できる値の振る舞いが変わります。
../../../_images/example2.png

図:処理結果情報は各エレメントの一つ前のエレメント情報を、それぞれ参照する。

ロジックフローを作成する上で、離れたエレメントの処理結果を参照したい場合は、「変数を利用したフロー」の利用を検討してください。

5.7.3.2. エラー発生後のハンドリングを行うフローの作成

次に、処理結果情報を用いてエラー発生後のハンドリングを行うフローを作成します。
作成するフローは「フローの準備」をベースとして、以下のとおりに編集するものとします。
  • 新しくロジックフローの入力として、ユーザコードを受け取る。

  • 「ユーザプロファイルの取得」タスクは、入力のユーザコードを利用してユーザプロファイルを取得する。

  • 「ユーザプロファイルの取得」タスクの処理結果に応じて以下のように振る舞うフローを定義する。
    • 正常に処理出来た場合は、取得結果からユーザ名を「ログ出力」タスクを利用して出力する。
    • 処理がエラーとなった場合は、処理がエラーになった旨を「ログ出力」タスクを利用して出力する。
フローの準備」で作成したフローのデバッグ画面を閉じ、編集画面を再表示した後に新しくフローを編集していきます。
  1. ロジックフロー定義編集画面上部、ヘッダ内の「入出力設定」をクリックし、入出力設定画面を開きます。

  2. 入力に以下のパラメータを定義します。

    パラメータ名
    userCd string
    ../../../_images/information_flow_create2.png

    図:新しい入力である「ユーザコード」の定義

  3. 「ユーザプロファイルの取得」タスクをクリックした上で、「マッピング設定」をクリックし、マッピング設定画面を開きます。

  4. マッピング設定を以下のとおりに設定します。

    入力(始点) 出力(終点)
    入力<object> - userCd<string> <object>im_immGetProfile1 - <string>userCd
    ../../../_images/information_flow_create3.png

    図:「ユーザプロファイルの取得」タスクのマッピング設定

  5. 以下のエレメントをフロー編集画面上に追加します。

    • 「基本」-「分岐」制御要素

    • 「汎用タスク」-「ログ出力」タスク(エラー発生時用)
      • タスクID、および、エイリアスは「im_logger1」とします。
    • 「汎用タスク」-「ログ出力」タスク(正常処理用)
      • タスクID、および、エイリアスは「im_logger2」とします。
    ../../../_images/information_flow_create4.png

    図:新しいエレメントの追加

  6. 追加したエレメント、および、既存のフローについて 以下のエレメント間に線を引きます。

    • 「ユーザプロファイルの取得」タスクから「分岐」制御要素
    • 「分岐」制御要素(then)から「ログ出力」タスク(エラー発生時用)
    • 「分岐」制御要素(else)から「ログ出力」タスク(正常処理用)
    • 「ログ出力」タスク(正常処理/エラー発生時)から「終了」制御要素
    ../../../_images/information_flow_create5.png

    図:ロジックフロー配線例

  7. 「分岐」制御要素をクリックし、プロパティのタスク固有設定の項目を以下のとおりに変更します。

    • 条件式(EL式)- 「${$task_result.error}
    ../../../_images/information_flow_create6.png

    図:条件の定義

  8. 「ログ出力」タスク(エラー発生時用)をクリックした上で、「マッピング設定」をクリックし、マッピング設定画面を開きます。

  9. マッピング設定を以下のとおりに設定します。

    入力(始点) 出力(終点)
    処理結果情報<object> - errorMessage<string> <string>im_logger1
    ../../../_images/information_flow_create7.png

    図:「ログ出力」タスク(エラー発生時用)のマッピング設定

  10. 「ログ出力」タスク(正常処理用)をクリックした上で、「マッピング設定」をクリックし、マッピング設定画面を開きます。

  11. マッピング設定を以下のとおりに設定します。

    入力(始点) 出力(終点)
    im_immGetProfile1<object> - localize<object> - userName<string> <string>im_logger2
    ../../../_images/information_flow_create8.png

    図:「ログ出力」タスク(正常処理用)のマッピング設定

  12. ロジックフローを保存します。

以上で、フローの編集が完了しました。

5.7.3.3. エラー発生後のハンドリングを行うフローの動作確認

最後に、編集したロジックフローしたエラーハンドリングの動作を確認します。
確認は「エラーハンドリングの設定、および、動作確認」と同じくデバッグ機能から行います。
先に正常に処理できた場合の動作を確認します。
  1. ロジックフロー定義編集画面上部、ヘッダ内の「デバッグ」をクリックし、デバッグ画面を表示します。

    ../../../_images/information_flow_check1.png

    図:デバッグ画面

  2. デバッグ画面上部、ヘッダ内の「実行」をクリックします。

  3. デバッグ実行の入力値として以下を定義し、実行します。

    • 入力<object> - userCd<string> - 「aoyagi
    ../../../_images/information_flow_check2.png

    図:デバッグ実行(正常)

  4. 実行結果として以下を確認してください。

    • ロジックフローがエラーを発生せずに正常終了していること。
    • 「ログ出力」タスクからサーバのコンソールに「青柳辰巳」が出力されていること。
次に処理の途中でエラーが発生した場合の動作を確認します。
  1. デバッグ画面上部、ヘッダ内の「実行」をクリックします。

  2. デバッグ実行の入力値として以下を定義し、実行します。

    • 入力<object> - userCd<string> - 「null
    ../../../_images/information_flow_check3.png

    図:デバッグ実行(エラー発生)

  3. 実行結果として以下を確認してください。

    • ロジックフローはエラーが発生しているが、正常に終了していること。
    • 「ログ出力」タスクからサーバのコンソールに「[E.IWP.LOGIC.IMMASTER.00003] ユーザコードが指定されていません。」というエラーメッセージが出力されていること。
これは、「ユーザプロファイルの取得」タスクでエラーが発生したか否かの情報($task_result.error)を利用して分岐処理が行われていることを表しています。
以上で、エラー発生後のハンドリングの動作が確認できました。