【UiPath】呼び出し先がエラーになったら呼び出し元の変数（引数）には値が反映されるか

方向をOut（InOut）にした引数について、呼び出し先でエラーになった場合、呼び出し元には反映されるかを検証した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/566dfeb6-175c-f386-4c04-6b5e1fd4a4f9.png)

結論としては、引数の型がシリアライザブルな型で、TryCatchでキャッチした場合は反映されない。

UiPath（vb.net）ではシリアライザブルな型はInt32、Boolean、String、DateTimeなどが該当し、シリアライザブルではない型はDataTable、Dictionaryなどが該当する。ちなみに、シリアライザブルではない型は引数の方向がInでも呼び出し元の変数が変更されるという仕様もある。

以下にパターンごとに検証した結果を記載する。

## 1.シリアライザブルな型

まず、シリアライザブルな型としてString型で検証する。
呼び出し元で変数に`A`を代入、呼び出し先では渡された変数の末尾に`B`、`C`と追記するワークフローを作成し、呼び出し前後で変数の中身を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/fac81a56-60db-8ac6-1a76-fa6b4f4701e5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/5a4cbf33-13b2-d329-bb05-167c1ee4c30a.png)

### 1-1.呼び出し先が正常する場合
呼び出し先が正常終了した場合の結果がこちら。
呼び出し前は`A`、呼び出し後は`ABC`と、想定通りに動作している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/a2d48f46-94d5-20de-c95b-6ffb2d1bd92a.png)

### 1-2.呼び出し先でエラーになり、「エラー発生時に実行を継続」した場合
呼び出し先のコードの`B`の代入と`C`の代入の間にスローを配置し、エラーを発生させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/e234ed98-7cda-5b2b-5d63-e67729365699.png)

呼び出し元のコードでは、「ワークフローを呼び出し」アクティビティのプロパティで「エラー発生時に実行を継続」にTrueとし、エラーを無視させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/2ccaa7db-cef5-05ff-1e55-87c177081d2c.png)

実行結果がこちら。
`B`の代入だけ反映され、呼び出し後は`AB`になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/b29bdf6c-bf22-3445-396f-d93e2fa75dea.png)

### 1-3.呼び出し先でエラーになり、TryCatchでCatchした場合
呼び出し先のコードにスローを配置するのは先ほどと同じ。
今度は呼び出し元のコードで「ワークフローを呼び出し」アクティビティをTryCatchで囲み、「エラー発生時に実行を継続」のプロパティはFalseに戻しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/3f80fea6-84c5-20fd-f199-be482dc40434.png)

実行結果がこちら。
`B`の代入は実行されているはずだが、呼び出し元には反映されず、変数は呼び出し前後で変わらず`A`のまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/3a979623-833a-cd1b-09ed-6d40130f4b46.png)

## 2.シリアライザブルではない型

次に、シリアライザブルではない型としてDataTable型で検証する。
呼び出し元で1行のテーブルを構築し、呼び出し先では渡されたテーブルに1行追加を2回行うワークフローを作成し、呼び出し前後でテーブルの行数を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/4eacad98-d9e4-7d42-7d20-f8959b08d223.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/8fdbc26e-4a25-c701-b37c-c4d3e2ccd95a.png)

### 2-1.呼び出し先が正常する場合
呼び出し先が正常終了した場合の結果がこちら。
呼び出し前は1行、呼び出し後は2行追加され3行と、想定通りに動作している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/6271ce5f-c31f-4e9e-232b-b3ff312f57cf.png)

### 2-2.呼び出し先でエラーになり、「エラー発生時に実行を継続」した場合
呼び出し先のコードの1行追加と1行追加の間にスローを配置し、エラーを発生させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/26e3e409-c803-676b-22c7-268c22d757d4.png)

1-2の検証と同様に「エラー発生時に実行を継続」をTrueに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/2ccaa7db-cef5-05ff-1e55-87c177081d2c.png)

実行結果がこちら。
1行追加が1度だけ実行され、呼び出し後は2行になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/deeb39fc-5851-021e-9e72-e0d0170e7e83.png)


### 2-3.呼び出し先でエラーになり、TryCatchでCatchした場合

1-3の検証と同様にTryCatchで囲む。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/39e62034-f251-5390-e54d-a0821d43bacb.png)

実行結果がこちら。
2-2の検証と同様に2行になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/bc079b08-19a2-a798-7457-3e74f6f71f77.png)

## まとめ
呼び出し先がエラーになった場合、引数の型がシリアライザブルな型で、かつTryCatchでキャッチした場合、呼び出し元の変数には反映されない。

|  | シリアライザブルな型 | シリアライザブルではない型 |
|:-:|:-:|:-:|
| エラー発生時に実行を継続  |  反映される | 反映される  |
| TryCatch  |  **反映されない** | 反映される  |

## 参考
https://qiita.com/HANACCHI/items/a3aa985c777e1abd326f

https://qiita.com/miya_gis/items/afbce4ae292c8ee57e90