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

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

【Power Automate】【TIPS】【解説編】フロー内のエラー処理をまとまった単位で行う

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

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

github.com

解説の経緯

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

解説するフローの概要(再掲)

Power Automate のフローにおけるエラー処理の組みかたについての私の経験則です。

- まとまった処理単位で固有のエラー処理を定義する

- フロー全体で共通のフロー処理を定義する

ステップごとの解説

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

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

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

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

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

このアクションは「コントロール」>「スコープ」です。

このスコープに含まれるアクションは下図の通りです。このスコープではエラーが発生したときの例を解説するため、必ずエラーが発生するアクションを配置しています。

「作成-ゼロ除算のエラーを発生させる」アクション

このアクションは「データ操作」>「作成」です。関数を使って意図的にエラーを発生させるために作成アクションを使います。

div(1,0)

div関数を使って「1÷0」を計算させます。当然、ゼロ除算のエラーが発生します。こうすることで意図的にエラーを発生させることができます。

フローの単体テストで例外処理のテスト項目を作成する際に個人的によく使います。

「スコープ-フェーズ1のエラー処理」アクション

このアクションは「コントロール」>「スコープ」です。

このスコープに含まれるアクションは下図の通りです。

スコープの「・・・」をクリックして「実行条件の構成」を選択します。

「実行されるタイミング」ですべてのチェックボックスをオンにします。こうすることで、直前のアクション(= 「スコープ-フェーズ1の処理」アクション)でのエラーの発生有無に関わらずこのスコープの処理が行われます。

「作成-スコープの処理結果を取得」アクション

このアクションは「データ操作」>「作成」です。result関数を使って「スコープ-フェーズ1の処理」アクションの実行成否を取得します。

result('スコープ-フェーズ1の処理')

result関数の結果はスコープ内のアクションの実行結果を表す配列です。

このアクションの出力は下図の通りです。Status(実行結果)が Failed(失敗)であることがわかります。

「選択-処理結果からアクション名と実行成否を取得」アクション

このアクションは「データ操作」>「選択」です。前述のresult関数の結果を見やすくするために欲しい情報の列のみを取得します。

"from": "@outputs('作成-スコープの処理結果を取得')",
"select": {
    "アクション名": "@item()['name']",
    "status": "@item()['status']"
}

このアクションの出力は下図の通りです。

「アレイのフィルター処理-実行成否が失敗であるものを取得」アクション

このアクションは「データ操作」>「アレイのフィルター処理」です。実行結果が失敗(Failed)である要素をフィルタして取得します。

"from": "@body('選択-処理結果からアクション名と実行成否を取得')",
"where": "@equals(item()['status'], 'Failed')"

このアクションの出力は下図の通りです。

「作成-失敗の件数」アクション

このアクションは「データ操作」>「作成」です。前述のアクションでフィルタして取得した配列が持つ要素の個数を取得します。

length(body('アレイのフィルター処理-実行成否が失敗であるものを取得'))

このアクションの出力は下図の通りです。

「条件-失敗が0件である」アクション

このアクションは「コントロール」>「条件」です。エラーの発生件数によって処理を分岐させます。

{"type":"If","expression":{"equals":["@outputs('作成-失敗の件数')",0]}

「はいの場合」の分岐

この分岐を通るのはエラーが0件のときです。この例外処理用スコープの目的は「何らかのエラーがあったときに例外処理を行う」であるため、この分岐ではアクションを配置しません。

「いいえの場合」の分岐

この分岐を通るのはエラーが1件以上発生したときです。この分岐に例外処理として任意のアクションを配置することができます。ここではエラーの発生回数の変数をカウントアップ(= 1を加算)しています。

「スコープ-フェーズ2の処理」アクション

このアクションは「コントロール」>「スコープ」です。

このスコープに含まれるアクションは下図の通りです。このスコープはエラーが発生しなかったパターンの解説に使用するため、何もアクションを配置していません。(何もアクションがなければエラーは発生しないです当然。(`・ω・´) )

「スコープ-フェーズ2のエラー処理」アクション

このアクションは「コントロール」>「スコープ」です。

このスコープに含まれるアクションは下図の通りです。配置するアクションは「スコープ-フェーズ1のエラー処理」と共通です。そのため、解説は割愛します。

スコープの実行タイミングですべてのチェックボックスをオンにしておくのも「スコープ-フェーズ1のエラー処理」と共通です。

result関数が指定するスコープは「スコープ-フェーズ2の処理」のほうです。

フローを実行すると、「スコープ-フェーズ2の処理」スコープではエラーが発生しないため条件アクションは「はいの場合」のほうを通ります。

「条件-エラー発生回数が1回以上である」アクション

このアクションは「コントロール」>「条件」です。この分岐処理によって「フローで1度でもエラーが発生した場合に実行する共通処理」を実現します。

{"type":"If","expression":{"greaterOrEquals":["@variables('エラーの発生回数')",1]}

この条件分岐では「エラーの発生件数」変数を使います。

「はいの場合」の分岐

この分岐を通るのはフロー全体でエラーが1件でも発生したときです。

「作成-エラー時の通知」アクション

このアクションは「データ操作」>「作成」です。エラーメールの本文を定義します。

エラー発生時刻:
@{convertTimeZone(utcnow(), 'UTC', 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm')}

エラー内容は下記リンクから参照してください。
<a href='https://flow.microsoft.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs/@{workflow()['run']['name']}'>ワークフロー実行結果画面</a>

本文に載せているリンクはこのフローの実行結果画面のリンクです。workflow関数を利用することで動的にURLを生成することができます。

この方法はふー(@fulogabc)さんのブログで紹介されている方法を使わせていただきました。

www.fulogabc.net

「メールの送信 (V2)」アクション

このアクションは「Office 365 Outlook」>「メールの送信 (V2)」です。エラーが発生した際に運用担当者にメールでエラーを通知します。

"parameters": {
"emailMessage/To": "admin@M365x80247309.OnMicrosoft.com",
"emailMessage/Subject": "エラーの通知です。",
"emailMessage/Body": "<p>@{replace(outputs('作成-エラー時の通知'), decodeUriComponent('%0A'), '<br/>')}</p>",
"emailMessage/Importance": "Normal"
},

「終了-フローを「失敗」ステータスで終了する」アクション

このアクションは「コントロール」>「終了」です。このアクションを使用する目的は「フロー内で1度でもエラーが発生した場合はフローの処理結果を"失敗"にすること」です。

フローの結果が"失敗"になるとフローの管理画面における実行履歴でも"失敗"と表示されます。いつ実行されたときにエラーになったのかがひと目で分かります。

「いいえの場合」の分岐

この分岐を通るのがフロー内で一度もエラーが発生しなかった場合です。このときは特になにも処理を実行しません。

最後に

概要編の投稿から日付が空いてしまいすみません。来月10月に引っ越しを予定しているため、プライベートで時間がとりづらい状況になっています。

引っ越しが完了したら、投稿ペースを徐々に戻していこうと計画しています。

m(__)m

今回は以上です。