【UiPath】TryブロックやCatchブロック内にcontinueやbreakを置いてもFinallyブロックは実行される

先日、Pythonの学習を行っていた際に以下の記述を見つけた。

>もし try 文が break 文、 continue 文または return 文のいずれかに達すると、その break 文、 continue 文または return 文の実行の直前に finally 節が実行されます。

https://docs.python.org/ja/dev/tutorial/errors.html

この動作はどのプログラムでもだいたい同じらしい。
ということでUiPathでも実際にそうなるのかを検証する。

## 検証
### パターン A: continueもbreakも無し
「繰り返し（指定回数）」アクティビティを使って2回ループを回し、Tryブロックで2回、Finallyブロックで1回ログを出力するワークフローを作成した。まずはcontinueもbreakも使わないパターンとして実行し、想定通りに2回のループで3回づつ、計6回ログが出力されていることが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/daa96975-7a5a-475a-86ed-ceced8f5ae7a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/839f8b53-f4c0-4166-a8a2-54dbbd09baaa.png)

### パターン B: Tryブロックにcontinue
Tryブロックのログ出力とログ出力の間にcontinue（現在の繰り返しをスキップ）を置く。この場合、Tryブロックのcontinueの後のログは出力されていないが、Finallyブロックのログは出力されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/d6c2c64e-3f7c-4262-96bf-443c626db634.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/ef4133f3-5ff1-4e43-a744-3d7d409c1399.png)

### パターン C: Finallyブロックにbreak
Finallyブロックのログ出力の前にbreak（繰り返しを終了）を置くと、Finallyブロックのログを出力した後に繰り返しを中断している。Finallyブロック内にcontinueやbreakを置いた場合でも、Finallyブロックは全て実行されるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/50603ad4-08ad-446f-957a-8519200f7947.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/edb6b72b-728b-43bd-9f88-b79d6f74d4ad.png)

### パターン D: Tryブロックにbreak、Finallyブロックにcontinue
TryとFinallyでループに対して別の指示を出してみたところ、Tryブロックのbreakが効いたのかループは1回で終わっている。この場合でも例によってFinallyブロックはきっちり最後まで実行されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/07e84b82-6919-4b70-ac37-f2e2bb755c9b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/40a5c4dc-4a99-42d5-9014-a6838c03ad56.png)

### パターン E: Tryブロックにcontinue、Finallyブロックにbreak
パターンDの逆の組み合わせ。画像は省略するが、この場合でもパターンDと同じ結果になる。continueとbreakではbreakが優先されるのだろうか？

### パターン F: Tryブロックにbreak、Finallyブロックにbreak
この場合、恐ろしいことにワークフローが終了しなくなる。内部的に無限ループになっているのだろうか？
この現象はFinallyブロックにbreakを2個配置した場合でも発生した。breakの指示を受け取ったままもう一度breakを踏むと固まるのかもしれない。なお、Tryブロックには仮にbreakを2個配置していても一つ目のbreakを踏んだ時点でFinallyに飛ぶので、特に問題はない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/e7827b79-4831-45b7-91ac-6e3bc74c71cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/c7c901f0-3dd2-4e73-b6e6-e3f138c1486f.png)

### パターン F: Tryブロックにcontinue、Finallyブロックにcontinue
こちらは特に異常な挙動は見せずにパターンBと同じ結果になる。ループが2回スキップされたりもしない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/32b92136-c07a-40df-8c2f-69e0532a9a71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/34e38fc5-17b0-4d60-9aea-f358d998b906.png)

## まとめ
記載は割愛したが、TryブロックではなくCatchブロックにcontinueやbreakを置いた場合でも同じ挙動になる。まとめとしては以下の通り。
- Try・Catch・Finallyの各ブロック内にcontinue・breakを置いても、Finallyブロックは最後まで実行される
- TryとFinallyの各ブロック両方にbreak置いたり、Finallyブロックにbreak2個置くと固まる

## 参考
https://qiita.com/taka_maenishi/items/a3d2c7f04f623d78623d

## 動作環境
UiPath.System.Actibities 24.10.7