【UiPath】GlobalHandlerX.xaml のちょっとやっかいな仕様の対処法

# はじめに

- 本記事では、StudioX のプロジェクトで（既定で）有効なグローバルハンドラー（GlobalHandlerX.xaml）の困った例外制御の仕様と対処法を扱います。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.10 バージョンのもので構成しています。

# GlobalHandlerX.xaml の何がやっかいなのか？　→　TryCatch（トライ キャッチ）で握りつぶせないケースがあるんです！

https://docs.uipath.com/ja/studio/standalone/2023.4/user-guide/global-exception-handler

![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c02f0627-2997-a770-81c0-ca0dab925ff9.png)

↑端的にいうと、トライキャッチでグローバルハンドラーを呼び出したいときは***トライセクション内にシーケンスを配置してください***と書かれており、これだけを呼んでパッと違和感を覚えることはあまりないとおもいます。
が、しかし、どういう仕様か可視化すると困った仕様であることがわかるかとおもいます↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/9a8c9085-82c1-48a6-3a04-ddff56e8d19f.png)

EXCELの各行のレコードを読み取って操作する処理があるとして、エラーが発生しても次のレコードの処理を継続したい場合に、***トライキャッチでエラーを握りつぶす***ことがあるかとおもいます。
この場合、エラーは無視したいため、グローバルハンドラーは呼び出されて欲しくない訳ですが、上図の右の様に***シーケンスやワークフロー呼び出しの中でエラーが発生するケースではグローバルハンドラーが実行される***のです。
グローバルハンドラーにエラーメールの送信処理など追加実装していた場合、繰り返し処理の回数分メールが飛んでしまうことになります。

グローバルハンドラーの処理が終了した際のアクションも次の様に分かれます。
- ***「ワークフロー呼び出し」***内でエラー　=＞　***停止アクションを指定していても***トライキャッチの***キャッチセクションには流れます***。
- ***シーケンス内でエラー、かつ、グローバルハンドラー内のUserActionが「停止（Stop）」*** =＞　***ランタイムエラーが発生し、トライキャッチのキャッチセクションには流れません！！***

トライキャッチで例外制御をマニュアル実装した際は、すべからく例外は無視して欲しい！！（心の叫び(。-`ω-)）

# どう対処する？

```
#案1　グローバルハンドラーを削除する
#案2　トライキャッチはアクティビティ単位で利用する
#案3　グローバル変数でグローバルハンドラーの処理を制御する
```

## 案1　グローバルハンドラーを削除する

![案1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/20f86187-e479-77e8-6da5-0f4d508c78fa.jpeg)

＜改修手順＞
1. GlobalHandlerX.xaml ＞ 右クリック ＞ グローバルハンドラーを削除
1. グローバルハンドラーの機能で必要なもののみ、本処理側のキャッチセクションに追加する

所感：例外制御を意識しなくてもよいから利用しているグローバルハンドラー。***StudioXではなく、Studioを普段づかいしている開発者であれば選択肢になる。***

## トライキャッチはアクティビティ単位で利用する

対象のアクティビティについて、「エラー発生時に実行を継続」のオプションに True を指定する、またはトライキャッチのトライセクションにアクティビティ単体で配置する。

（例）「エラー発生時に実行を継続」のオプションに True を指定
![案2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/1f8815a5-2c99-0e40-f2ba-d681bc9f7510.jpeg)

（例）トライセクションにアクティビティ単体で配置する
![案2_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e4aa4531-0705-2b3c-6bbb-7d61c6d4a697.jpeg)

所感：***トライセクションの中身が少ないときはこちらが一番簡単で早い。*** 標準アクティビティの多くは「エラー発生時に実行を継続」オプションがついているので、トライキャッチの中ではこちらをONにするといった開発ルールを敷いてもよいかもしれませんが、グローバルハンドラーの使い勝手のよさが損なわれているようにも感じます。。。

## 案3　グローバル変数でグローバルハンドラーの処理を制御する

＜改修手順＞
1. グローバルハンドラーの処理制御用の『グローバル変数』を作成する
1. グローバルハンドラー側に処理分岐を追加する（上で作成したグローバル変数の値に応じた実行制御）
1. （本処理側）トライキャッチの直前でグローバル変数の値を指定する
1. （本処理側）トライキャッチの直後にグローバル変数の初期化処理を追加する
1. トライセクション内がシーケンスの場合、サブワークフロー化し、「ワークフロー呼び出し」で実行する ***※グローバルハンドラー内のUserActionに「継続（UserAction = Skip）or Result=ErrorAction.Continue」を指定する場合はシーケンスも利用可能***

::: note
Result=ErrorAction.Continue　→　本処理側のキャッチセクションに戻れる
UserAction="Skip"　→　本処理側に戻るがキャッチには入らない
:::

（例）グローバル変数を作成
![案3_4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/464582f7-c6f0-d196-f38e-1caabf607e9f.jpeg)

（例）実装イメージ
![案3_5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/4e663b0f-911a-4003-ef79-c5c89ce31b6d.jpeg)

所感：決してスマートではないが、***局所的にグローバルハンドラーの機能をOFFにしたい***場合の案です。トライセクションのシーケンス内のエラーでもキャッチセクションに戻ってこれれば、こちらの案は結構推しの案です。。。残念。

# さいごに

グローバルハンドラーは同じ例外制御機構のトライキャッチとの相性はあまりよいとはいえません。
本記事の挙動（仕様）はガイドに記載があるものの、シーケンス内でエラーが発生した際のランタイムエラーは修正があってもよいのではないかとおもいます。
機能改善要望に一石を投じたいとおもうので、本記事に共感された方はイイねをポチっとしていただけると幸いです。
最後までお読みいただきありがとうございます(・ω・)ノ