先日、Pythonの学習を行っていた際に以下の記述を見つけた。
もし try 文が break 文、 continue 文または return 文のいずれかに達すると、その break 文、 continue 文または return 文の実行の直前に finally 節が実行されます。
この動作はどのプログラムでもだいたい同じらしい。
ということでUiPathでも実際にそうなるのかを検証する。
検証
パターン A: continueもbreakも無し
「繰り返し(指定回数)」アクティビティを使って2回ループを回し、Tryブロックで2回、Finallyブロックで1回ログを出力するワークフローを作成した。まずはcontinueもbreakも使わないパターンとして実行し、想定通りに2回のループで3回づつ、計6回ログが出力されていることが確認できる。
パターン B: Tryブロックにcontinue
Tryブロックのログ出力とログ出力の間にcontinue(現在の繰り返しをスキップ)を置く。この場合、Tryブロックのcontinueの後のログは出力されていないが、Finallyブロックのログは出力されている。
パターン C: Finallyブロックにbreak
Finallyブロックのログ出力の前にbreak(繰り返しを終了)を置くと、Finallyブロックのログを出力した後に繰り返しを中断している。Finallyブロック内にcontinueやbreakを置いた場合でも、Finallyブロックは全て実行されるようだ。
パターン D: Tryブロックにbreak、Finallyブロックにcontinue
TryとFinallyでループに対して別の指示を出してみたところ、Tryブロックのbreakが効いたのかループは1回で終わっている。この場合でも例によってFinallyブロックはきっちり最後まで実行されている。
パターン 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に飛ぶので、特に問題はない。
パターン F: Tryブロックにcontinue、Finallyブロックにcontinue
こちらは特に異常な挙動は見せずにパターンBと同じ結果になる。ループが2回スキップされたりもしない。
まとめ
記載は割愛したが、TryブロックではなくCatchブロックにcontinueやbreakを置いた場合でも同じ挙動になる。まとめとしては以下の通り。
- Try・Catch・Finallyの各ブロック内にcontinue・breakを置いても、Finallyブロックは最後まで実行される
- TryとFinallyの各ブロック両方にbreak置いたり、Finallyブロックにbreak2個置くと固まる
参考
動作環境
UiPath.System.Actibities 24.10.7