はじめに:エラーと引数について
UiPathでは、呼び出し先のワークフロー内で処理途中にエラーが発生した場合、エラー発生前にOut方向の値型引数に値を設定していても、その値は呼び出し元のワークフローには渡されません。(参照型など一部の例外はあります。)
このため、エラー発生時に呼び出し元へ情報を渡すにはException
オブジェクトに頼る場面が多くなります。Exception
のMessage
プロパティを使うのも有効ですが、こちらには規定のエラー情報も入るため、あまり変更したくないところではあります。そこで使われるのが、Exception
のData
プロパティです。
ExceptionのDataプロパティ
Exception
のData
プロパティはIDictionary
型のコレクションで、Exception
生成時に自動的に作られます。その中には自由に値を追加することができ、エラーの詳細などを柔軟に呼び出し元へ伝える手段として活用できます。
実装例
以下は実装例です。「True か確認」で発生したエラーをTryCatch
で一度キャッチし、Exception
のData
プロパティにキーと値を設定し、再度スロー(再スロー)しています。ここではキーに「Detail」、値に「"エラーの詳細です。"」を設定していますが、キー・値どちらも任意のものを設定することが可能です。
以下は上記のワークフローを呼び出すワークフローです。呼び出し先で発生したエラーをキャッチし、Exception
のメッセージと、Data
プロパティの「Detail」キーの値をログに出力しています。
実行結果が以下のログです。エラーメッセージとは別に、Data プロパティに設定した「Detail」の内容が出力されていることが確認できます。
Data プロパティにキーが設定されていない場合にも備える
Data プロパティに指定したキーが存在しない場合、その値を参照しようとするとエラーになる可能性があります。これを防ぐために、以下のように is Nothing を使ってキーの存在をチェックし、未設定の場合はメッセージを表示しないなどの対応が有効です。
キーは出来るだけ固定に
実際の運用上では、同じワークフロー内で複数のキーを使い分けると、管理が煩雑になりやすいという課題があります。たとえば、エラーの種類ごとに "ValidationError"、"TimeoutInfo"、"UserContext" など異なるキーを設定してしまうと、呼び出し元でどのキーが設定されているかを毎回確認する必要があり、キーの存在チェックやログ出力の条件分岐が複雑になる等の問題が発生します。
そこで、キーは基本的に固定し、値の中身を状況に応じて柔軟に変更するという運用が効果的です。 この方法なら、呼び出し元では今回の例で言えば常に "Detail" キーを参照すればよく、コードの見通しが良くなり、保守性も向上します。
動作環境
- UiPath.System.Activities v25.6.1
参考