はじめに
この投稿は、RPA ツールの UiPath で「処理を途中で終了させる」方法についての話です。
この投稿は、UiPathのコミュニティ「UiPath Friends」が企画する「UiPathブログ発信チャレンジ2021サマー」の 15日目の投稿でもあります。
企画の内容は こちら 。カレンダーのURLは こちら です。
処理を途中で終了させたい = ガード節・アーリーリターン
フローの中で「後続の処理をせずに終了させたい」ときがあります。
プログラミングの世界では「ガード節」という概念があり、続行不要な処理を判定して「以降の処理をガード・抑止する」という書き方があります。初歩的なガード節は「if:条件分岐」を書いてブロックする というものです。
また「アーリーリターン」という手法も有り、処理が不要になったら「Return・Break・Continue」で終わらせるという書き方もあります。雑に言うと「早めにReturnして後続の処理をしない」というものです。
ガード節には「処理をしない」という意図があり、、アーリーリターンは「終了させる」という意図がありますが、どちらも「早期に処理を終了させる」という意味では同じです。
ガード節・アーリーリターンのメリット、デメリットは以下です。
メリデメ | 説明 |
---|---|
メリット | 例外処理と通常処理が分離されるので、何をするコードか「分かりやすい」 |
メリット | Elseの処理が減りネストが浅くなることで「コードがシンプルになる」 |
デメリット | コードが縦に長くなり「見栄えが悪くなる」 |
デメリット | ガードしたことに気付かず「処理の追加時にバグを出してしまう」 |
デメリット | 判定処理の分だけ「処理が遅くなる」(早期終了にならなかった場合。微々たるもの) |
UiPathのコードでも早期終了したい
UiPathで処理を早期終了したい場合は、以下の方法があります。
- 1)ワークフローを終了 アクティビティ
- 2)フロー条件分岐 アクティビティ(フローチャート)
- 3)例外をスロー
- 4)繰り返しをブレーク アクティビティ
以下で説明します。
1)ワークフローを終了 アクティビティ
UiPathはWWF(WindowsWorkflowFoundation)をベースに作られていますが、このアクティビティのネームスペース「System.Activities.Statements.TerminateWorkflow」となっています。ここから判断すると、このアクティビティは「UiPathが独自(またはラップ)実装」しているわけではなく、WWFのActivitiesクラスの処理をそのまま呼び出しているようです。
使用すると、そのタイミングでロボットの処理が終了しますが、以下のようなポップアップが表示されてしまいます。ポップアップ表示は必要なケースは良いですが、多くの場合、このポップアップは不要です。表示したければ自分で表示するので。
なので、このアクティビティは少し残念、というか使えません。ポップアップはいらないんです。
UiPathフォーラムで「ダイアログが出ないようにしてほしい」という要望も出ていて、UiPath側に伝わっていますが、まだ対応されていません。
2)フロー条件分岐 アクティビティ(フローチャート)
xamlをフローチャートで作り、条件分岐で処理を終了にしてしまえば、実現できます。
処理内容は下記のようなイメージです。
ただ、この方法は「フローチャート」式のzamlでしか使えず、「シーケンス」では使用できないのが残念です。
3)例外をスロー
処理をトライキャッチ アクティビティで囲んで、例外をスローすれば以降の処理はスキップされます。
現実的にはこの方法を採用することが多いと思います。ただし「例外処理の実装は、パターンを考慮する必要があり、簡単ではない」ので、よく仕様を考えた上で採用する必要があります。
4)繰り返しをブレーク アクティビティ
繰り返しのループの中であれば「ブレーク アクティビティ」で「繰り返しで囲まれた処理」を続行せずに、スキップできます。
実はこの方法は「複数回の処理繰り返し」でなく「1回の処理繰り返し」でも使用できます。
内容は下記のようなイメージです。
ちょっと邪道のようですが、上記のような「1回しかループしない処理の中で、Breakさせて後続の処理をスキップする」実装もできます。
終わりに
いかがでしたでしょうか。実装の際に、何かの参考になれば幸いです。
この記事が参考になったら「LGTM」をお願いします。閲覧ありがとうございました。