処理を途中で止める方法


#1

親のワークフローから、invoke work flowで子のワークフローを呼び出し、
さらに子のワークフローから孫のワークフローを呼び出しています。

孫のワークフローないで問題が発生したときに、全体の処理を即時止めたいのですが、
このようなときに使うべきアクティビティはどれか、わかる方教えていただけませんか?
phpでいうとexitの様な事をしたいのです。

よろしくお願いします。


#2

自己レスです。

Terminate Workflow というアクティビティを使用すると止まる(?)様なのですが、
アクティビティガイドに掲載が無く、プロパティの設定方法がわかりません。

適当に記述すると、エラーが発生してしまいます。


#3

問答無用でワークフローを止めるアクティビティは、ご認識のとおり[Terminate workflow]です。
エラーが出ます、というのは、以下画面のことを指していますかね。
もし以下であれば、期待通りの動きをしています。
(停止画面が Exception 画面なのでわかりづらいですね)
%E7%84%A1%E9%A1%8C

上は[Exception]プロパティに [new Exception(“あああああ”)] って止めた場合、
下は[Reason]プロパティに文字列を入れた場合です。
最終的なExceptionが異なっていますね。

孫ワークフローのエラーで止めたいという話は、
[Invoke Workflow]の戻り値を[If]アクティビティで分岐させて、止めたいほうに[Terminate workflow]をいれるのがよいですかね。


#4

少し余談になりますが。

孫のワークフローないで問題が発生したときに、全体の処理を即時止めたいのですが

問題、というのは実運用では2種類考えられまして、

  1. そもそもUiPathのシステムが発生させる例外(Exception)
  2. 発生が想定されるけど、UiPathはエラーにしないもの(処理件数0等)

の、どちらかを明確にする必要があります。

後者であれば、Terminate Workflowでもいいのですが、Throw アクティビティで例外を発生させるのも方法として検討してみてください。
(引数のExceptionには、最初は New Exception(“エラーメッセージ”) のように入力すれば動作します)

Throw と、Terminate Workflowの違いは、Try catchで受け取れるかどうか、という点になります。
将来的に。
・エラーが発生したときに親Workflow内でリカバリをして操作を継続する処理を組み込む
・起動しているアプリケーション等は一旦閉じる
・終了前にログを吐き出したい
といった要件が追加された場合には、Throwで親Workflowに例外を返してやるほうが、柔軟に処理ができるようになります。Try Catchで握りつぶすこともできてしまうので、Workflowを慎重に作る必要が出てきますが。
(兎にも角にも問答無用で止めたい、といのであれば、Terminate Workflowのほうが正解です)

#もっと過激な方法で、Invoke Methodを使用して、System.Threading.Thread.CurrentThreadのAbortを呼び出す方法も……UiPath側が「いつの間にか実行終わっちゃったよ!?」というエラーを出すほどに一瞬で止まります。


#5

yukino さん honoka さん、ありがとうございました。