Invoke 内でのIn/Out変数の挙動

知ってる人がいたら以下のケースを教えてください。
Invoke work flow で、In/Out で定義したString(A) があったとして、
呼び出し先の中でStringの内容を変更(A–>B)して、適当なExceptionをThrowしたとします。

これを呼び出し元でのTry-catchで拾った場合、StringはBで拾われると
思っていたのですが、テストプログラムを作ったところ、呼び出し先から出たタイミングでAに変更されてました。

質問としては、

  1. これは何か設定の問題でしょうか?(変数を引き継ぐ方法はあるんでしょうか?)
  2. VBとして自然な動きなのでしょうか?詳しい型がいれば教えてほしいです。

以下、テストで作ったxamlです。

Main.xaml (8.9 KB)
BeInvoked.xaml (5.2 KB)

以上、よろしくお願いします。
J,

設定というよりは言語(というのも変かもしれませんが)の仕様です。

VBとして、というと難しいのですが。UiPathの範疇で使えるVB.NET構文としては(他機能との整合性も含めると)正しい動きです。

もう少し踏み込んだ書き方をすると、例えば以下のような VB.NET コードがあったとします。

Sub Main()
    Dim N As Integer = 0

    Try
        Test1(N)
    Catch ex As Exception
        Console.WriteLine(N)    ' 1が表示される
    End Try
End Sub

Sub Test1(ByRef A As Integer)
    A = 1
    Throw New Exception()
End Sub

これだと、コメントにあるように「1」が表示されます。
このあたりと「In/Out」の表記は混同しやすい、です。

ただ、UiPathでは、このような参照渡しをしているわけではなく、基本的にInvoke Workflow Fileが正常に終わった段階で、引数の値を上書きしています。

理由はいくつか考えられるのですが、おそらく「Invoke Workflow Fileの途中でExceptionが発生したときに、どこまで処理がされたかわからず、その結果、変数値のリカバリが難しくなる」といったところではないでしょうか。

あとは、前述のように、他のUiPathのActivityで、出力値を変数に設定していても、そのActivityの実行時にExceptionが発生したら、出力値は変更されないですよね。
なので、それらの機能との整合性を考えると、変更しない、が正しいのではないかな、と思います。

1 Like

@Honoka さん

毎度回答どうもありがとうございます。

やっぱりそうなんですね。in/outと書いてあるので、参照渡しして当然だ、という認識があったので混乱しましたが、確認が取れてすっきりしました。
まあそういう仕様であればそれに沿ったロジックを考えればいいので、知れてよかったです。

どうもありがとうございます。
J,

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.