ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【Power Automate】【解説編】子フローを使ってエラー処理をする

掲題のフローについての解説編です。

このフローをGitHubで公開しました。下記リンク先からダウンロードしてください。

子フローの使いかたのサンプルであるため、フロー単体ではなくソリューションにしています。

github.com

解説の経緯

今回の投稿は概要編の続きです。

フロー(再掲)

親フロー(エラー処理の子フローを呼び出す側のフロー)

赤枠の2箇所がエラー処理の子フローを呼び出す部分です。子フローを呼び出す際に、エラーが発生したかどうかを判定したスコープの実行結果を入力情報として渡しています。

エラー処理をするためのフロー(呼び出される側のフロー)

今回の投稿のメイン部分です。

親フローから呼び出されたこのフローが、親フローから受け取った情報を読み取ってエラー情報を親フローに返します。

ステップごとの解説

(親フロー)「選択したメッセージの場合」トリガー

名前の通り、フローを手動で実行するトリガーです。今回はこのトリガーでの入力情報はありません。

(親フロー)「変数を初期化する-エラーの発生回数」アクション

このアクションは「変数」>「変数を初期化」です。「フロー内で1度でもエラーが発生したら、共通のエラー処理を実行する」を実現するためにエラーの発生回数をカウントする目的で使用します。

(親フロー)「スコープ-フェーズ1の処理」アクション

エラーが発生したかどうかを判定する範囲を定義するためにこのフローではスコープを使用します。

エラーを明示的に発生させるためにdiv関数を使ってゼロ除算エラーを発生させます。

(親フロー)「子フローの実行-エラー処理-フェーズ1」アクション

「子フローの実行」アクションを使って子フロー「共通_エラー処理」を呼び出します。エラー情報を取得したいスコープの実行結果をresult関数で取得して子フローに渡します。 

  • 子フロー
    • 共通_エラー寄り
  • スコープの処理結果
    • @result('スコープ-フェーズ1の処理')

result関数では指定したスコープに配置しているアクションの実行結果を取得することができます。

この実行結果には「アクションの名前」「実行開始時間」「実行終了時間」「実行成否(正常終了なのか異常終了なのか)」のほか「エラーのコード」「エラーメッセージ」が含まれています。

[
  {
    "name": "作成-ゼロ除算のエラーを発生させる",
    "startTime": "2023-12-24T15:01:21.3881323Z",
    "endTime": "2023-12-24T15:01:21.3890592Z",
    "trackingId": "c658bc65-ce66-45b1-a70c-ef251476a3b6",
    "clientTrackingId": "08584981782874860677786655697CU17",
    "code": "BadRequest",
    "status": "Failed",
    "error": {
      "code": "InvalidTemplate",
      "message": "Unable to process template language expressions in action '作成-ゼロ除算のエラーを発生させる' inputs at line '0' and column '0': 'Attempt to divide an integral or decimal value by zero in function 'div'.'."
    }
  }
]

(子フロー)「手動でフローをトリガーします」トリガー

親フローから呼び出して実行を行うために子フローではこのトリガーを使用しています。親フローから受け取る情報をトリガーで定義しています。今回の子フローでは「スコープの処理結果」というプロパティ名のテキスト情報を受け取るようにしています。

親フローから渡された情報は出力画面で確認することができます。

(子フロー)「変数を初期化する」トリガー

エラーの発生有無を格納する変数を定義します。初期値はfalse(エラーは発生していない)です。

(子フロー)「作成-スコープの処理結果を取得」トリガー

このアクションは「データ操作」>「作成」アクションです。triggerBody関数を使って親フローから渡された情報(= result関数の結果)取得しています。

(子フロー)「作成-スコープの処理結果を取得」から「条件:失敗が0件である」まで

これらのアクションを使って「result関数の結果にエラーのアクションが含まれているか」を判定します。

このロジックは以前公開した下記フローを流用しているため割愛します。

wataruf.hatenablog.com

(子フロー)「PowerApp または Flow に応答する」アクション

このアクションを使って子フローから親フローに情報を返します。ここでは変数に格納されている bool値を返しています。

  • true ・・・ 親フローから提示されたresult結果にエラーが含まれている
  • false ・・・ 親フローから提示されたresult結果にエラーが含まれいない

このイメージ図における「エラーが発生しています」の部分がこのアクションで実施している内容です

(親フロー)「子フローの実行-エラー処理-フェーズ1」アクション ※実行結果

子フローから返された情報は、親フローが子フローを呼び出したアクションの出力にあらわれます。この情報は親フローの後続のアクションで使用することができます。

(親フロー)「条件-フェーズ1でエラーが発生」アクション

前述のアクションの結果(エラーの実行有無がtrue)である場合は分岐アクションと「変数の値を増やす」アクションを使ってエラーの発生回数の変数をカウントアップします。

(親フロー)「スコープ-フェーズ2の処理」から「条件-フェーズ2でエラーが発生」まで

フェーズ1と同様に「フェーズ2の処理」という名前のスコープについても子フローを使ってエラーの判定を行います。

このスコープではエラーは発生していないため、エラー発生回数のカウントアップは行われません。

(親フロー)「条件-エラー発生回数が1回以上である」

エラーの発生回数が1回以上であるかで条件分岐を行います。こうすることで1度でもエラーが発生した場合に特定の処理を行うことができます。

ここでは保守担当宛にエラー発生を通知するメールを送信しています。

フローの完了ステータスを「エラー」にするために「終了」アクションを使用しているところもポイントです。

このフローの解説は以上です。