【UiPath】 正常/異常/例外の判定にまつわるTIPS

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

【初めに】
現在仕事の狭間にあって、このタイミングで、自分なりのテンプレートを作成してみようと思い立ち…
その際に、業務処理が全て成功する「正常終了」ケースと、業務処理が一部失敗する「異常終了」ケースと、そもそも例外を検出しまった「例外終了」ケースをどう扱うかに悩んでいました。

大概は、例外終了を判断させる変数と、正常終了か異常終了かを判断させる変数の二つを用意すると思いますが、それもちょっとCoolではないなぁと思っていたのでした。

では、どう対応したか？ **始まり！始まり！**
- - - 
## そもそもは...
大概は、「条件分岐」アクティビティを使用して、正常（Then）か異常（Else）かだけを判断させてもいいように作ればいいのですが、やはりテンプレートをとなると、例外で終わった状態情報も欲しくなるわけで...
ここでは、正常終了かどうかを判断させる”SUCCESS”と言うBoolean型の変数と、例外終了かどうかを判断させる”EXCEPTION”と言うBoolean型の変数とを用意してみた。

|EXCEPTION|SUCCESS|結果|
|:-:|:-:|:-:|
|TRUE|不問|例外|
|FALSE|TRUE|正常|
|FALSE|FALSE|異常|

こうなると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/ba15263d-02ab-0273-528a-fcde9b8ccf55.png)
こんな感じのロジックを実装します。

これはこれで正しいのですが、例えば業務ロジックを細分化し「ワークフロー ファイルを呼び出し」アクティビティを使用する時に、（私だけかもしれませんが）引数の設定を2つするのが手間だったりする訳で…

- - - 
## ２）一つの項目で、複数の（最低３つの）意味を持たせるには...
### ２-1) Boolean型の”EXCEPTION"を廃し、Boolean型の”SUCCESS"を、Int型にしてみる
Boolean型の変数には、TrueとFalseの状態しか保持できません。ですので、ここはInt型にしてみました。
Int型ですと、正の整数、０、不の整数と、３つの状態を判断する事ができますね。

|SUCCESS|結果|
|:-:|:-:|
|1|正常|
|0|異常|
|-1|例外|

こういう意味合いを持たせると、それこそ「条件分岐」アクティビティではなく、「条件分岐 (switch)」アクティビティで、実装できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/9088c48d-10d3-33d8-8967-2f2dc320a6e4.png)

この場合でも大丈夫ですけど、「条件分岐 (switch)」アクティビティは、複数のCaseを展開する事ができないので、可読性に難あるかなと思っています。まぁ、仕様書がしっかりしていれば、それを読めって事なんですけどね(^^♪

### ２-2) Int型の”SUCCESS"に、処理件数の意味も持たせたい。
まぁ、こんな事は、普通はしないでしょうけど、テンプレートを作るうえで、ちょっとしたテクニックを実装しておき、開発者が新しい"きづき"を得てもらえばと言うのも考えたりしています。
この要望ですと、おそらくInt型の”SUCCESS"の値を、後続の処理終了メールの処理件数として展開したりするのでしょう。

で、処理件数の意味も持たせたいと言う事で、
|SUCCESS|結果|
|:-:|:-:|
|n|正常|
|0|異常|
|-1|例外|
となります。

こんな状況で実装してみましょう。

この場合ですと、「条件分岐」アクティビティを組み合わせて、-1かどうか、0かどうか、それら以外かを判定すればよさげですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/3978222c-ebba-2a22-2d79-022e66b7f291.png)

### ２-3) Int型の”SUCCESS"に、処理件数の意味以外にも例外した意味も持たせたい。
これも事は、普通はしないでしょうけど、テンプレートを作るうえで、ちょっとしたテクニックを実装しておき、開発者が新しい"きづき"を得てもらえばと言うのも考えたりしています（同じフレーズの使いまわし）。

で、処理件数の意味も持たせたいと言う事で、
|SUCCESS|結果|
|:-:|:-:|
|n|正常|
|0|異常|
|-m|例外|

こんな状況で実装してみましょう。

この場合ですと、「条件分岐」アクティビティを組み合わせて、0より小さいかどうか、0かどうか、それら以外かを判定すればよさげですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/07b70aee-b6ab-fb59-11bc-a1fbb7f1e920.png)

Int32.CompareTo メソッドは、Int32.CompareTo メソッドの引数に指定された値と比べて、大きい場合は1を、小さい場合は-1を、一致しているならば0を返してくれるものです。ですので
```
SUCCESS.CompareTo(0).Equals(-1)
```
と記載したら、「SUCCESSの値が、0とCompareToして、その結果が-1と一致するか？」すなわち、「SUCCESSの値が0より小さいか」と言う判断になります。

### ２-4) Int型の”SUCCESS"に、処理件数の意味以外にも例外した意味も持たせたい(PART2)。
Int32.CompareTo メソッドで評価をしてみましたが、その他にもこんな方法があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/24057c61-5b38-7b72-0ec9-e76708ca0a07.png)

Math.Abs メソッドは、Math.Abs メソッド の引数に指定された数値の絶対値を返してくれるものです。ですので
```
Not SUCCESS.Equals(Math.ABS(SUCCESS))
```
と記載したら、「SUCCESSの値が、SUCCESSの値の絶対値と等しくない」と言う判断になります。例えばSUCCESSの値が-2だとしたら、
```
Not SUCCESS.Equals(Math.ABS(SUCCESS))
↓
Not -2.Equals(Math.ABS(-2))
↓
Not -2.Equals(2)
↓
∴ True
```
こうする事で、例外判定の他に、Int型の”SUCCESS"のマイナス値の絶対値から、配列に展開した、例外時のメッセージを後続の処理終了メールのリカバリプランとして展開したりする事ができますね。

- - - 

##おわりに
いかがでした？

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！