2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Power Automate】例外処理の実装方法

Posted at

はじめに

Power Automate の例外処理はテンプレートで公開されています。
image.png
しかし、これでは少し物足りないため、解説しつつ改良した例外処理をご紹介します。

基本的なフローの流れ

先ずは「Try」「Catch」「Finally」と3つの【スコープ】を用意して順に並べます。
Try の中にはメインの処理を記述し、Finally には毎回必ず処理したい内容を記述します。
image.png

実行条件の構成

Automate で例外処理を実現する上で重要な設定が 「実行条件の構成」 です。
スコープの三点リーダを押して、上記をメニューから選択します。
image.png
通常は「に成功しました」にデフォルトでチェックが入っていますが、そのチェックを外して、「に失敗しました」(必要に応じて「がタイムアウトしました」)のチェックを入れて「完了」を押します。
image.png
上記を設定すると、Try と Catch のスコープを繋ぐ矢印が赤色に変わります。
これにより、Try 内でエラー/タイムアウトが発生すると Catch に処理が流れるようになります。
image.png
Finally も同様の手順で 4つ全て のチェックを入れます。
image.png

Catch スコープ内の実装

下記の流れのそれぞれの要素について説明します。
image.png

URLの生成

例外が発生したフローの「詳細画面」と「実行履歴詳細」画面に遷移するURLを生成します。

[詳細画面イメージ]
image.png

[実行履歴詳細画面イメージ]
image.png
「組み込み -> データ操作 -> 作成」アクションを2つ追加して、それぞれ以下の内容を入力することで、上記画面に遷移するURLを生成できます。
image.png

フローの詳細画面の URL
https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/details
フローの実行履歴詳細の URL
https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs/@{workflow()['run/name']}

エラー内容の解析

「組み込み -> コントロール -> Apply to each」アクションを追加して、「以前の手順から出力を選択」の箇所にresult('Try')を指定します。これにより、Try スコープで発生した複数のエラー情報に対して処理できます。
image.png
また、その中に「組み込み -> データ操作 -> JSON の解析」アクションを追加します。
「コンテンツ」には動的なコンテンツから現在のアイテムを選択してください。
そして「スキーマ」には下記の内容を入力します。

スキーマ
{
    "type": "object",
    "properties": {
        "name": {
            "type": "string"
        },
        "inputs": {
            "type": "object",
            "properties": {
                "host": {
                    "type": "object",
                    "properties": {
                        "apiId": {
                            "type": "string"
                        },
                        "connectionReferenceName": {
                            "type": "string"
                        },
                        "operationId": {
                            "type": "string"
                        }
                    }
                },
                "parameters": {
                    "type": "object",
                    "properties": {
                        "dataset": {
                            "type": "string"
                        },
                        "table": {
                            "type": "string"
                        },
                        "id": {
                            "type": "integer"
                        }
                    }
                }
            }
        },
        "outputs": {
            "type": "object",
            "properties": {
                "statusCode": {
                    "type": "integer"
                },
                "headers": {
                    "type": "object",
                    "properties": {
                        "Vary": {
                            "type": "string"
                        },
                        "X-SharePointHealthScore": {
                            "type": "string"
                        },
                        "X-MS-SPConnector": {
                            "type": "string"
                        },
                        "X-SP-SERVERSTATE": {
                            "type": "string"
                        },
                        "DATASERVICEVERSION": {
                            "type": "string"
                        },
                        "SPClientServiceRequestDuration": {
                            "type": "string"
                        },
                        "X-DataBoundary": {
                            "type": "string"
                        },
                        "X-1DSCollectorUrl": {
                            "type": "string"
                        },
                        "X-AriaCollectorURL": {
                            "type": "string"
                        },
                        "SPRequestGuid": {
                            "type": "string"
                        },
                        "request-id": {
                            "type": "string"
                        },
                        "MS-CV": {
                            "type": "string"
                        },
                        "Strict-Transport-Security": {
                            "type": "string"
                        },
                        "X-FRAME-OPTIONS": {
                            "type": "string"
                        },
                        "Content-Security-Policy": {
                            "type": "string"
                        },
                        "MicrosoftSharePointTeamServices": {
                            "type": "string"
                        },
                        "X-Content-Type-Options": {
                            "type": "string"
                        },
                        "X-MS-InvokeApp": {
                            "type": "string"
                        },
                        "Timing-Allow-Origin": {
                            "type": "string"
                        },
                        "x-ms-apihub-cached-response": {
                            "type": "string"
                        },
                        "x-ms-apihub-obo": {
                            "type": "string"
                        },
                        "Cache-Control": {
                            "type": "string"
                        },
                        "Date": {
                            "type": "string"
                        },
                        "P3P": {
                            "type": "string"
                        },
                        "X-AspNet-Version": {
                            "type": "string"
                        },
                        "X-Powered-By": {
                            "type": "string"
                        },
                        "Content-Length": {
                            "type": "string"
                        },
                        "Content-Type": {
                            "type": "string"
                        },
                        "Expires": {
                            "type": "string"
                        },
                        "Last-Modified": {
                            "type": "string"
                        }
                    }
                },
                "body": {
                    "type": "object",
                    "properties": {
                        "status": {
                            "type": "integer"
                        },
                        "message": {
                            "type": "string"
                        }
                    }
                }
            }
        },
        "startTime": {
            "type": "string"
        },
        "endTime": {
            "type": "string"
        },
        "trackingId": {
            "type": "string"
        },
        "clientTrackingId": {
            "type": "string"
        },
        "clientKeywords": {
            "type": "array",
            "items": {
                "type": "string"
            }
        },
        "code": {
            "type": "string"
        },
        "status": {
            "type": "string"
        },
        "error": {
            "type": "object",
            "properties": {
                "code": {
                    "type": "string"
                },
                "message": {
                    "type": "string"
                }
            }
        }
    }
}

ちなみにこのスキーマの内容については、エラー発生時の「コンテンツ」の内容をコピーしておき、「JSON の解析」アクションの【サンプルから作成】に貼り付けることで生成できます。

[エラー発生時のコンテンツ内容例]
image.png
[サンプルから作成するときの入力例]
※ 上記コンテンツの内容を貼り付けて「完了」を押します。
image.png
ただし、エラーの内容によって JSON の内容も変わるので、上記で記載したスキーマはある程度のエラー内容ならカバーできるように盛り盛りにしてあります。

失敗判定

エラー内容を解析できたところで次は、その内容から処理に失敗しているかどうかを判定します。(ループ処理の名前を分かりやすく「Error Results Loop」としたものの、よく考えたらエラーで無いものも含まれるため、もう少し実態に合った名前にした方がいいかも・・・)

「組み込み -> コントロール -> 条件」アクションを追加して、左辺には「動的なコンテンツ」からstatusを選択してください。(status は2種類ありますが、下記イメージのようにbody('JSON_の解析')?['status']の方を選択してください)
そして右辺にはFailedを入力してください。(文字列ですが、ダブルやシングルクオートの括りは不要)
image.png

エラー通知(メール送信の例)

失敗判定が「はい」の方にエラーを通知する処理を追加します。
例では「メールの送信」としていますが、Teams への通知といった処理でもいいと思いますので、ご自由に処理を追加してください。

今回は「標準 -> Office 365 Outlook -> メールの送信 (V2)」アクションを追加します。
image.png
【本文】の内容をコピーしたものを下記に貼り付けておきます。

本文
フロー名  : @{workflow()?['tags']?['flowDisplayName']}
アクション名: @{body('JSON_の解析')?['name']}
ステータス : @{body('JSON_の解析')?['status']}
エラー内容 : @{body('JSON_の解析')?['code']}
@{body('JSON_の解析')?['outputs']?['body']?['message']}
@{body('JSON_の解析')?['error']?['message']}

【フローの詳細画面の URL】:
@{outputs('フローの詳細画面の_URL')}

【フローの実行履歴詳細の URL】:
@{outputs('フローの実行履歴詳細の_URL')}

[存在しないリストを更新したときの通知内容例]
image.png

終了処理

最後に「組み込み -> コントロール -> 終了」アクションを追加します。
自分は特に何もしていませんが、必要に応じてカスタマイズしてみてください。
image.png
この後は Finally のスコープに処理が移りますが、自分は特に何も処理していないので、こちらも必要に応じて処理を追加してください。不要なら Finally スコープ自体消してしまってもいいと思います。

参考サイト

さいごに

いまのところ作成したフローには全て上記の例外処理を入れてありますが、共通化する方法がないか、もしくは今後のアップデートで出来るようになるといいなぁと思います。

また、ユニフェイスでは新しいことにチャレンジしたい人材を募集しておりますので、気になる方はぜひご応募お願いします😊
技術ブログも公開していますのでこちらもチェックしてみてください!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?