1.はじめに
RPAを使い始めて、例外を知ったという方もいるかもしれませんが、UiPathの例外には他のプログラミング言語にはない特徴があります。
今回はVB.Netでのプログラミング経験のない方ある方両方から、想定通りの動作をしないということで問い合わせを頂くことがあったので、内容の紹介と対応方法についてお話をしたいと思います。
2.UiPath例外発生時の特徴
UiPathのロボットで例外が発生した場合、VB.Netと同じようにSystem.Exceptionクラスのエラーが主に発生します。例外自体には変わりありませんが、xaml呼び出しした先で例外が発生すると、引数が変わらないという状況が発生します。
実際にユースケースを見てみましょう。以下のように引数に出力を設定している場合を考えてみます。一見すると、例外発生前にxaml呼び出し先で値が変わっていれば、呼び出し元でも値が変わっていると考える方がいるかもしれません。
呼び出し元(例えば、Main.xamlなど):
呼び出し先:
これを実行すると、呼び出し先xaml内では引数「out_処理ステータス」に値が入っていることが確認できます。
一方で、呼び出し元xamlに例外がスローされると、呼び出し元xaml側の変数「str_処理ステータス」は Nullとなります。 書き換えが行われません。(「ワークフロー ファイルを呼び出し」が実行される前の値のままになります)
ただし、以下の条件を すべて 満たす場合、呼び出し側のWorkflowでの、変数への操作が適用される場合があります。
- 「ワークフロー ファイルを呼び出し」のプロパティで、「分離」が設定されていない(False)
- 呼び出し側のワークフローの引数設定で、方向(Direction)が「入力/出力」になっている
- 変数の型が 参照型 である(値型ではない)
たとえば、DataTable型の変数を「入力/出力」で渡して、呼び出し先のWorkflowで、行の追加や削除を行った後、例外が発生したようなケースで、前述の動作が発生します。この場合、DataTableへの編集内容は、呼び出し元のWorkflowにおいても、呼び出し先での例外が発生する直前の状態、すなわち「ワークフロー ファイルを呼び出し」実行前の値とは、異なる値になっています。
上記で言う値型は、「Byte, SByte, Char, Short, UShort, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, Bool」と、列挙型・構造体です。列挙型・構造体はあまりUiPathで直接扱うことはないと思います。
また、String型は、厳密な分類では参照型なのですが、 上記の動作については値型と同じ動作をします。 つまり、本件に関する動作については、Int32等と同じ括りで、例外の発生時には、呼び出し側での操作の影響を受けることはない、という認識で問題ありません。
逆に、Int32やString等、上記に挙げた型 以外を使う場合、注意が必要ということになります。
現時点において、これは製品仕様ということになります。
ここまでの記事を見て、疑問に思わない方もいらっしゃると思いますが、VB.Netの開発をしたことがある方からすると、出力=参照渡し(Byref)メソッドと同様と考える方が多いかと思います。もちろん参照渡しであれば、例外が発生しても呼び出し元でも呼び出し先で設定した値を参照することが可能となります。ここに落とし穴があるわけです。
3.対応方法
例外発生時にMain.xamlにメッセージ以外で情報を伝えたい場合、どのようにすることで対応可能かについてお話をしていきましょう。
System.ExceptionクラスにはDataプロパティが存在します。DataプロパティはIDictionary型の空のコレクションオブジェクトであり、KeyとValueのペアによって任意の値を設定することが可能となります。この機能を利用することで例外発生時に「例えば、処理ステータス」を連携し、メールの情報に付加することができます。
呼び出し元(例えば、Main.xamlなど):
呼び出し先:
警告
呼び出し先では「再スロー(ReThrow)」アクティビティを利用して上位に例外を通知する必要がある点に注意ください。
4.最後に
例外処理関連の挙動については、他にも独自の動作をするようなので、機会があれば記事にしていきたいと思います。
また、Dataプロパティに「FaultedDetails」というものがあり、過去例外発生元の情報が自動で設定されていましたが、今はDisplayNameのみが取得できる状況となりますので、最新の情報に注意して設計開発をして頂ければと思います。
本記事はあくまでも個人の見解を述べているものとなりますので、参考情報として頂ければと存じます。