今回はPowerAutomateのエラーハンドリングについてのTIPSです。
Problem
ワークフロー内に外的要因でエラーとなりやすい箇所がある。
当該エラーの原因はワークフロー内では解決しようがなくエラーとなった場合は無視したい。
しかし他のエラーが起きた場合はきちんとワークフローを失敗させたい。
事例:
ワークフロー内でTeamsコネクターの「チームにメンバーを追加する」アクションを実行している。
アクションでは追加対象者の指定にユーザープリンシパル名を利用するが、フローの入力データの問題で時折無効なユーザープリンシパル名が混入してしまう。
無効な値の混入でエラーとなった場合はこれを無視して後続の処理を行わせたい。
ただしもしそれ以外のエラーの場合は後続処理を行わずワークフローを失敗させたい。
Solution
エラーとなりうるアクションの後に、当該アクションがエラーになった時のみ起動し、エラー内容を判定して「無視」もしくは「失敗」させるアクションを連結する。
先ほどの「事例」をもとに具体的なフローを示すと:
- ここで「スコープ」内の「チームにメンバーを追加する」は無効なユーザープリンシパル名が指定されると「NotFound」エラーになる。
- 後続の「作成 チームメンバー追加エラー」はアクションの設定「Run after」により前段処理がエラーになった時のみ実行される。実行されるとその後に続く「作成 特定の〜」も実行される。
- 1つ目の「作成」でエラー内容を示す情報を取得し2つ目の「作成」でエラー内容次第で「無視」もしくは「失敗」を制御している。わかりやすくするために2つのアクションに分けているが、1つのアクションにまとめてしまっても機能的に問題はない。
「チームにメンバーを追加する」アクションでエラーが発生すると、当該アクションのbody(...)
には次のような "error"
プロパティが設定される:
{
"error": {
"code": "NotFound",
"message": "Failed to find user with id 'XXXX@XXXX' in the tenant",
"innerError": {
"date": "2024-09-19T00:43:20",
"request-id": "7e005119-d24e-4094-8ccd-9b23148ce70e",
"client-request-id": "7e005119-d24e-4094-8ccd-9b23148ce70e"
}
}
}
1つ目の「作成」ではこの"error"
プロパティを取り出している。「Run after」の設定で前段処理が失敗した時のみ実行されるようにしてある:
2つ目の「作成」では前段処理で取り出したエラー情報のうち"code"
プロパティの内容をチェックして、もし'NotFound'
だったらnull
を返しそれ以外だったらゼロ除算エラーを引き起こすようにしている:
if(equals(outputs('作成_チームメンバー追加エラー')['code'],'NotFound'),null,div(1,0))
前述の通り1つ目の「作成」と2つ目の「作成」はまとめて1つにしても機能上問題ない。