親ロボットに内蔵するTryCatchのCatch部分について個人用の備忘録です。
まず、Catchには「BusinessRuleException」「System.Exception」の2種類を用意します。

■System.Exception部分について

① エラー時の時刻を取得します。
string = Now.ToString("yyyyMMMdd_HHmmss")
② エラー文言を作成
「exception.Message」がエラー内容そのもの
「exception.Source」がエラーを起こしたアクティビティ名
「exception.StackTrace」がエラーの詳細情報
下記のエラー文言をString型変数に代入する。
【エラー文】
"ロボットが異常終了しました。" + Environment.NewLine +
"原因を確認してロボットを再実行してください。" + Environment.NewLine +
"<exception.Message>" + Environment.NewLine +
exception.Message + Environment.NewLine +
"<exception.Source>" + Environment.NewLine +
exception.Source + Environment.NewLine +
"<exception.StackTrace>" + Environment.NewLine +
exception.StackTrace
③ エラー文をテキストファイルに書き込み
基本はロボフォルダの中に「error」というフォルダを作成しておき、①で作成したエラー時刻をファイル名にしてテキストファイルを作成。
書き込みするエラー文は②で作成したもの。error\yyyyMMdd_HHmmss.txt と出力。
④ エラースクリーンショットを作成
TakeScreenShotアクティビティでスクリーンショットを撮影できる。
アクティビティプロパティの出力には、UiPath.Core.image型の変数を用意。
⑤ エラー画像を保存
工程④で撮影したimage型変数をSaveImageアクティビティでpngファイルとして保存します。
出力先は③同様、error\yyyyMMdd_HHmmss.png と出力。
⑥ エラーが発生したことをユーザーに通知
この例ではエラー内容をMessageBoxアクティビティで出力しているが、メールで出力することが多い。
メールで通知する際には必ず、②のエラー文、④のエラースクリーンショットを添付して送信すること。
■BusinessRuleException部分について

こちらもSystem.Exception同様、スクショ、エラー文を記載してもよい。
ただ、個人的にはロボが異常終了したのではなく「ロボ実行に必要なファイルが不足している」「ロボを実行できる状況ではない」等、ロボを動かす前段階でユーザーが準備しなければいけないことを忘れていた場合に使用しているため、ロボ実行開始した初期段階で発生することを想定。
そのため、MessageBoxアクティビティにexception.Messageだけとかなり簡素な作りにしている。
なお、BusinessRuleExceptionを出力するためにはTry内で、Throwアクティビティを使用し例外を発生させる必要がある。

上記画像はスローアクティビティの配置例。
勤怠情報を入力するロボにて、入力するべき勤怠情報が存在しなかった場合にThrowアクティビティに進むようにしている。

上記画像は具体的なThrowアクティビティの中身。
カッコ内に勤怠情報が存在しなかった場合に出力したいエラー文を記載している。
これにより、Catch内にフローが進んだ時に、exception.Messageに上記エラー文が格納され、MessageBoxやメールにエラー内容を記載できる。
■補足(ロボットの作りとexception.Sourceについて)
exception.Sourceは異常が発生したアクティビティ名を保持しているが、TryCatchアクティビティのTry内で異常終了が発生しても、exception.Sourceで異常が発生したアクティビティ名を取得することが出来ない。
exception.Sourceで取得できるのは、Try内でInvokeWorkflowアクティビティで呼び出した外部のロボを使用した際に、外部ロボでエラーが発生したときのみ接続元のCatch内にて外部ロボの異常発生したアクティビティ名を使うことが出来る。
そのためなるべくロボットを作る際には親ロボット、子ロボット(役割ごとに分割したロボ)という形で作成し、子ロボに処理内容は任せ、親ロボは子ロボの呼び出しと異常終了時のTryCatchだけ用意する仕組みにしておくのが良いと思われる。