[UiPath]「グローバル例外ハンドラ」というとっても便利そうな新機能を教わったので、内容をまとめました。

#概要
- グローバルハンドラは2018.4くらいから新しくできた機能。
    - なのでまずUiPathのVerを最新まで上げてから使うようにしてください
- グローバルハンドラは1プロジェクトに1個（複数作っても1個しか認識されない）。
    - 新規→グローバルハンドラーをクリックすると作れます。「グローバルハンドラー.xaml」という名前で保存されます
    - 既存のものを他所から持ってきてこれをグローバルハンドラーにしたい、というときは左ペインのそれの上で右クリックして、コンテキストメニューの中に「これをグローバルハンドラーにする」みたいなやつがあるのでそれをクリックするとグローバルハンドラーになります（アイコン変わる）
    - グローバルハンドラとして認識されているxamlは、UiPathStudioのプロジェクトで見たときにアイコンがちがう（普通のxamlはUiアイコン、グローバルハンドラはマルみたいなやつ）

　　下のスクショで言うと、緑で囲ってあるのはグローバルハンドラです、赤いのはそうじゃない（アイコンが異なります）
　　　　　　![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/142092/1fff3fed-94ee-b4fa-cf39-5f993463ae4c.png)


[公式の説明はこちらです　Global Exception Handler (グローバル例外ハンドラー)](https://studio.uipath.com/lang-ja/docs/global-exception-handler "UiPathStudioガイド")
このリンク先ページの下にグローバルハンドラの見本がzipで置いてあるのでそれをそのまま使ってもいいとおもいます

#各アクティビティに入れるもの
###ビジネスルール例外かどうかを判定する
```VB
errorInfo.Exception.GetType.Name.Contains("BusinessRuleException")
```
　※ビジネス例外になるところへスローのアクティビティで、例外に「New BusinessRuleException」を入れます、これがグローバルハンドラの入力引数に渡されます


###エラーメッセージをログ出力する（簡易）
```VB
errorInfo.Exception.GetType.ToString + ":" + errorInfo.Exception.Message + vbcrlf + "[対象] " + errorInfo.ActivityInfo.Name
```

###エラーメッセージをログ出力する（詳細）
```VB
errorInfo.Exception.ToString + vbcrlf + "[対象] " + errorInfo.ActivityInfo.Name
```

####※簡易と詳細でログ出力内容はこのくらいちがいます
#####【簡易】
```VB
{
  "message": "UiPath.Excel.ExcelException:HRESULT からの例外:0x800AC472\r\n[対象] Excel アプリケーションスコープ スコープの名前",
  "level": "Warning",
  "logType": "User",
  "timeStamp": "11:08:39",
  "processVersion": "1.0.0.0",
  "jobId": "********-****-****-****-*************",
  "robotName": "TenantName\\RobotName",
  "machineId": 0,
  "fileName": "グローバルハンドラー"
}
```

#####【詳細】
```VB
{
  "message": "UiPath.Excel.ExcelException: HRESULT からの例外:0x800AC472 ---> System.Runtime.InteropServices.COMException: HRESULT からの例外:0x800AC472\r\n   場所 Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)\r\n   場所 UiPath.Excel.WorkbookApplication..ctor(String workbookPath, String password, Boolean visible, Boolean autoSave, Boolean createNew, String editPassword, Boolean readOnly)\r\n   --- 内部例外スタック トレースの終わり ---\r\n   場所 UiPath.Excel.WorkbookApplication..ctor(String workbookPath, String password, Boolean visible, Boolean autoSave, Boolean createNew, String editPassword, Boolean readOnly)\r\n   場所 UiPath.Excel.Activities.ExcelApplicationScope.Execute(NativeActivityContext context)\r\n   場所 System.Activities.NativeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)\r\n   場所 System.Activities.ActivityInstance.Execute(ActivityExecutor executor, BookmarkManager bookmarkManager)\r\n   場所 System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)\r\n[対象] Excel アプリケーションスコープ スコープの名前",
  "level": "Error",
  "logType": "User",
  "timeStamp": "11:08:44",
  "processVersion": "1.0.0.0",
  "jobId": "********-****-****-****-*************",
  "robotName": "TenantName\\RobotName",
  "machineId": 0,
  "fileName": "グローバルハンドラー"
}
```


###エラーの後の動作(ErrorAction)
- 継続　ErrorAction.Continue
- リトライ　ErrorAction.retry　※リトライ回数はerrorInfo.RetryCountで0からカウントアップされる
- 強制終了　ErrorAction.Abort

#これを踏まえて作ってみたグローバルハンドラのフローチャート
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/142092/71cdef7f-f240-8d8c-7f2d-83a0b2927cd7.png)

- ビジネスルール例外のときはそのまま処理に戻します（ログ出さない）
- エラー（簡易）のときはリトライします、3回リトライしたらアウト、エラー（詳細）をログ出力して強制終了しています

#終わりです
VB.NETとかPowerShellとか、知ってます！名前くらいだったら！
というレベルで勉強中です。
なので多分にあやふやとか教わったまま棒暗記とかいいかげんなところがあると思います。
そういうところは教えてください。ありがとうございます。