【UiPath】処理を途中で終了させる

# はじめに

この投稿は、RPA ツールの UiPath で「処理を途中で終了させる」方法についての話です。

この投稿は、UiPathのコミュニティ「UiPath Friends」が企画する「UiPathブログ発信チャレンジ2021サマー」の 15日目の投稿でもあります。

企画の内容は [**こちら**](https://note.com/shumpei_w/n/n651cbdbec4e8) 。カレンダーのURLは [**こちら**](http://u0u1.net/sUwZ) です。

https://twitter.com/ShumpeiWatanabe/status/1405168150736359427?s=20


# 処理を途中で終了させたい ＝ ガード節・アーリーリターン

フローの中で「後続の処理をせずに終了させたい」ときがあります。

プログラミングの世界では「ガード節」という概念があり、続行不要な処理を判定して「以降の処理をガード・抑止する」という書き方があります。初歩的なガード節は「if：条件分岐」を書いてブロックする というものです。

また「アーリーリターン」という手法も有り、処理が不要になったら「Return・Break・Continue」で終わらせるという書き方もあります。雑に言うと「早めにReturnして後続の処理をしない」というものです。

ガード節には「処理をしない」という意図があり、、アーリーリターンは「終了させる」という意図がありますが、どちらも「早期に処理を終了させる」という意味では同じです。

https://qiita.com/kouyan/items/7b8b456b626447a1e24e

https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%BC%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

ガード節・アーリーリターンのメリット、デメリットは以下です。

| メリデメ | 説明 |
|:-:|:-|
|:o: メリット　| 例外処理と通常処理が分離されるので、何をするコードか「分かりやすい」|
|:o: メリット　|Elseの処理が減りネストが浅くなることで「コードがシンプルになる」|
|:x: デメリット|コードが縦に長くなり「見栄えが悪くなる」|
|:x: デメリット|ガードしたことに気付かず「処理の追加時にバグを出してしまう」|
|:x: デメリット|判定処理の分だけ「処理が遅くなる」（早期終了にならなかった場合。微々たるもの）|

# UiPathのコードでも早期終了したい

UiPathで処理を早期終了したい場合は、以下の方法があります。

- 1）ワークフローを終了 アクティビティ
- 2）フロー条件分岐 アクティビティ（フローチャート）
- 3）例外をスロー
- 4）繰り返しをブレーク アクティビティ

以下で説明します。

# 1）ワークフローを終了 アクティビティ

UiPathはWWF（WindowsWorkflowFoundation）をベースに作られていますが、このアクティビティのネームスペース「System.Activities.Statements.TerminateWorkflow」となっています。ここから判断すると、このアクティビティは「UiPathが独自（またはラップ）実装」しているわけではなく、WWFのActivitiesクラスの処理をそのまま呼び出しているようです。

https://docs.microsoft.com/en-us/dotnet/api/system.activities.statements.terminateworkflow?redirectedfrom=MSDN&view=netframework-4.8

使用すると、そのタイミングでロボットの処理が終了しますが、以下のようなポップアップが表示されてしまいます。ポップアップ表示は必要なケースは良いですが、多くの場合、このポップアップは不要です。表示したければ自分で表示するので。
なので、このアクティビティは少し残念、というか使えません。ポップアップはいらないんです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/1b36054d-7b0e-a6f0-2603-5130178feeca.png)

UiPathフォーラムで「ダイアログが出ないようにしてほしい」という要望も出ていて、UiPath側に伝わっていますが、まだ対応されていません。

https://forum.uipath.com/t/terminate-workflow-pop-up-option/168077


# 2）フロー条件分岐 アクティビティ（フローチャート）

xamlをフローチャートで作り、条件分岐で処理を終了にしてしまえば、実現できます。

https://docs.uipath.com/activities/lang-ja/docs/flow-decision

処理内容は下記のようなイメージです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/a3f00e83-6727-1c03-4165-71c1d128e6af.png)

ただ、この方法は「フローチャート」式のzamlでしか使えず、「シーケンス」では使用できないのが残念です。

# 3）例外をスロー

処理をトライキャッチ アクティビティで囲んで、例外をスローすれば以降の処理はスキップされます。

https://docs.uipath.com/activities/lang-ja/docs/try-catch

処理内容は下記のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/e21e8e48-a756-fde3-ffec-27264d69f9c8.png)


現実的にはこの方法を採用することが多いと思います。ただし「例外処理の実装は、パターンを考慮する必要があり、簡単ではない」ので、よく仕様を考えた上で採用する必要があります。

# 4）繰り返しをブレーク アクティビティ

繰り返しのループの中であれば「ブレーク アクティビティ」で「繰り返しで囲まれた処理」を続行せずに、スキップできます。

https://docs.uipath.com/activities/lang-ja/docs/break

処理内容は下記のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/d8160f67-6f71-b70e-b6a0-8878408d35ad.png)

実はこの方法は「複数回の処理繰り返し」でなく「1回の処理繰り返し」でも使用できます。
内容は下記のようなイメージです。

![aaae67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/9b79baf9-2aa1-6772-88fe-3e6e140a85fb.png)

ちょっと邪道のようですが、上記のような「１回しかループしない処理の中で、Breakさせて後続の処理をスキップする」実装もできます。

# 終わりに

いかがでしたでしょうか。実装の際に、何かの参考になれば幸いです。

この記事が参考になったら「LGTM」をお願いします。閲覧ありがとうございました。