【Power Automate】Try/Catchでエラー通知を後付けする|スコープと設定

Power AutomateでTry/Catchのスコープ2つを使いエラー通知を後付けする構成図 Power Automate

Power Automateでフローを作って動かすと、次に気になるのが「止まったときに気づけるか」です。この記事では、既に動いているフローを作り直さずに、Try/Catchの形でエラー通知を追加する手順をまとめます。

この記事でできること

  • 動いているフローに手を加えず、エラー通知だけを後から足せる
  • フローが失敗したときだけTeamsのチャネルに通知が飛ぶ
  • 通知が届いた時点で、どのアクションが何で失敗したかが分かる

Power Automateに「Try/Catch」という名前のアクションはありません。スコープを2つ並べ、片方に本体を入れ、もう片方を失敗時だけ動かすことでTry/Catchの形を作ります。

完成イメージ

フローが失敗すると、Teamsのチャネルに次の4点が並んだメッセージが届きます。

  • フロー名
  • 発生時刻(日本時間)
  • 失敗したアクション名とエラー内容
  • 実行履歴へのリンク
Teamsチャネルにエラー通知が届いた画面

全体の実装構成

追加するアクションは4つです。

アクションリネーム後の名前役割
スコープTryMain本体をまるごと囲む
スコープCatchNotifyTryMain が失敗したときだけ動く
アレイのフィルター処理FilterFailed失敗したアクションだけを抜き出す
チャットまたはチャネルでメッセージを投稿するPostErrorTeams通知本文を送る

フローの編集画面では次のような並びになります。

Recurrence(トリガー)
InitMonth(変数を初期化する)      ← Tryの外に残す
InitDay(変数を初期化する)        ← Tryの外に残す
InitvarMentions(変数を初期化する) ← Tryの外に残す

TryMain(スコープ)
  └ 取得アクション・案件ループなど本体まるごと

CatchNotify(スコープ)※失敗時のみ実行
  ├ FilterFailed(アレイのフィルター処理)
  └ PostErrorTeams(Teams投稿)
フローの編集画面

⚠️トリガーや変数の初期化はスコープの中に入れられない仕様なので外に出します。

実装手順

Step1|本体をスコープで囲む

トリガーの直後に「スコープ」アクションを追加し、TryMain にリネームします。

空のスコープを置いたら、既存のアクションをドラッグで中へ移動します。アクション同士の参照は名前で繋がっているため、順序を保ったまま移せば式は壊れません。

ただ、変数の初期化アクションは、トップレベルにしか置けない仕様なので、TryMain には取得アクションと本体のループだけを入れました。変数の初期化は実質失敗しないアクションなので、外に残しても「致命的な失敗を捕まえる」という目的は満たせます。

Step2|通知用のスコープを並べて置く

TryMain の後に、もう1つ「スコープ」を追加し CatchNotify にリネームします。

⚠️ TryMain のではなく、外・下に置きます。

Step3|失敗したときだけ動くように設定する

ここがTry/Catchの心臓部です。

CatchNotify の「設定」を開き、次のように設定します。

チェック項目設定
成功しましたOFF
タイムアウトしたON
スキップ済みであるOFF
失敗しましたON

「成功しました」のチェックを外して、「失敗しました」と「タイムアウトした」のチェックを入れるとフローがエラーを出した時だけ通知が飛びます。

画像だと分かりにくいですが、設定が反映されるとTryMain から CatchNotify へ伸びる矢印が点線に変わります。

実行条件の構成で失敗しましたとタイムアウトしましたにチェックを入れた画面

Step4|失敗したアクションだけを抜き出す

CatchNotify の中に「アレイのフィルター処理」を追加し、FilterFailed にリネームします。

TryMain の中にあるアクションの実行結果は、result(‘TryMain’) で配列として取り出せます。この配列から status が Failed のものだけを残せば、失敗したアクションが分かります。

開始(From)欄:fx から次の式を入力します。

result('TryMain')

⚠️ result() は動的コンテンツの一覧に出てきません。fx(式)のタブから手入力します。

条件欄:「詳細モードで編集する」に切り替えて次の式を入力します。

@equals(item()?['status'], 'Failed')

⚠️ 左辺の ?[‘status’] を書き忘れて item() だけにすると、アクションの結果オブジェクト全体と ‘Failed’ を比べることになり、結果が常に0件になります。

FilterFailedアクションのパラメーターを表示している画面

Step5|通知本文に4つの情報を差し込む

FilterFailed の下に「チャットまたはチャネルでメッセージを投稿する」を追加します。投稿者はフローボット、投稿先はチャネルを選び、自分の環境のチームとチャネルを指定します。

本文に差し込む4点の式は次のとおりです。

発生時刻(日本時間)

convertFromUtc(utcNow(),'Tokyo Standard Time','yyyy/MM/dd HH:mm:ss')

失敗したアクション名

first(body('FilterFailed'))?['name']

エラー内容

coalesce(
  first(body('FilterFailed'))?['outputs']?['body']?['error']?['message'],
  first(body('FilterFailed'))?['outputs']?['body']?['message'],
  first(body('FilterFailed'))?['error']?['message'],
  first(body('FilterFailed'))?['code'],
  'エラー詳細なし'
)

最初、エラー内容を first(body(‘FilterFailed’))?[‘error’]?[‘message’] だけで組みましたが、テストするとこの欄だけ空欄で届きました。実行履歴を追うと、SharePointコネクタのエラーメッセージは first(body(‘FilterFailed’))?[‘outputs’]?[‘body’]?[‘message’]の側に入っていました。

FilterFailedアクションの出力でエラーメッセージを表示している画面

コネクタによってエラーメッセージの入る場所が違うようだったので、coalesce() で候補を順に並べ、最初に見つかった値を使う形にしました。最後に ‘エラー詳細なし’ を置いているため、エラーが取れなくても空欄にはなりません。

実行履歴へのリンク

concat('https://make.powerautomate.com/environments/',
       workflow()?['tags']?['environmentName'], '/flows/',
       workflow()?['name'], '/runs/', workflow()?['run']?['name'])

⚠️ この式はソリューション外のフロー用です。ソリューション内のフローはURLのパスが変わります。

Step6|わざと失敗させて通知を確認する

エラー通知は、実際に失敗させてみないと動作を確認できません。私は取得アクションのフィルタークエリを一時的に壊してテストしました。

  1. 取得アクションのフィルタークエリで、列名を存在しない名前(私は末尾に文字を足しました)に一時変更する
  2. 保存して公開し、手動でテストを実行する
  3. TryMain が失敗し、CatchNotify が動いて通知が届くことを確認する
  4. フィルタークエリを正しい値に戻し、保存・公開まで済ませる

1回目は、失敗したアクション名・実行履歴のリンク・発生時刻は正しく表示され、エラー内容だけが空欄でした。Step5の coalesce に書き換えて2回目を実行すると、「列 ‘TriggerTypeXX’ が存在しません。〜」と表示することができました。

ハマりポイントまとめ

No起きたこと対応
1「変数を初期化する」がスコープの中に移動できないトップレベルにしか置けない仕様。初期化アクションはTryの外に残す
2正常終了した日も通知が飛ぶ設定で「成功しました」のチェックを外す
3result() が動的コンテンツに出てこないfx(式)タブから手入力する
4フィルターの結果が常に0件になる左辺を item() ではなく item()?[‘status’] にする
5エラー内容だけ空欄で届くcoalesce() で ?[‘outputs’]?[‘body’] 側も候補に入れる

まとめ

今回のポイントです。

  • Try/Catchはスコープ2つで作る。本体を TryMain で囲み、直後に並列で CatchNotify を置く
  • CatchNotify の「設定」で、「タイムアウトした」・「失敗しました」をON、「成功しました」・「スキップ済みである」をOFFにする。条件付き実行の設定になると矢印が点線に変わる
  • テストは列名をわざと壊して行い、確認が終わったら必ず元に戻す

フローは作ってから時間が経つほど見なくなります。止まったことに気づけないまま放置される状態を避けたい人は、Try/Catch のスコープを参考にしてみてください。

Power Platformを触り始めたばかりの方に向けて、こういった詰まりポイントをこれからも発信していきます。よかったらブログをブックマークして、またのぞきに来てください。

あわせて読みたい

この記事で扱ったフロー本体の作り方は、次の記事にまとめています。先に読むと全体像がつかみやすくなります。

【Power Automate】特定の日だけ処理するフローの作り方|毎日起動+リスト照合
Power Automateで特定の日だけ処理を動かす方法を解説します。繰り返しトリガーに書けない日程は、毎日フローを起動してSharePointリストの起動日と照合し、該当しない日は終了アクションでスキップする形にすると扱えます。リストの列設計・月日の判定式・条件式を設定値つきでまとめました。

Plannerを使ったタスク配布の実装も、同じTry/Catchの枠を移植して使っています。

【Power Automate】Plannerに1人1タスクを自動配布する|バケット振り分け方法
Power AutomateでSharePointの名簿からPlannerのタスクを1人1つ自動作成する手順をまとめました。バケットのGUIDの控え方、Switchによる課別の振り分け、変数の初期化、100件で打ち切られないための改ページ設定まで解説します。

コメント

タイトルとURLをコピーしました