UiPath

【UIPath】 トライキャッチやリトライ スコープによるエラーハンドリング

UiPath Studioの開発では、エラーハンドリングを実装することでロボットを安定稼働させることができます。

しかし、プログラミング未経験の方は、エラーハンドリングの経験がなく、戸惑われる方が多いです。

この記事では、トライキャッチ、リトライ スコープやスローによるエラーハンドリング方法について、解説します。

 

ペンギンさん
ペンギンさん
長い記事なので、参照したい章をクリックもしくはタップしてください。

例外(エラー)の種類

例外(エラー)の種類は、アプリケーション例外とビジネス例外に分かれます。

アプリケーション例外

アプリケーション例外は、システムやネットワークなど技術的な問題で発生するエラーのことを指します。

UiPathでのアプリケーション例外の例は、

  • セレクターが見つからなくてクリックできない
  • 指定したファイルが見つからない
  • 文字列の変数を数値型に変換した
  • データテーブル型の変数で、存在しない行列を指定した

です。

ペンギンさん
ペンギンさん
アプリケーション例外が発生した場合、エラーハンドリングを行わないと、プロセスが停止します。

ビジネス例外

ビジネス例外は、自動化処理で使用するデータが、業務的な観点で不備があることを指します。

UiPathでのビジネス例外の例は、

  • 製品価格が上限を超えているデータ
  • 商品コードが誤っているデータ
  • 決裁権のない部門で購入された商品データ

です。

ラッコくん
ラッコくん
ビジネス例外は、エラーを発生させてプロセスを停止し、人にデータを修正してもらう必要があるよ。

 

例外発生内容に応じた処理(トライキャッチ)

例外発生内容に応じて処理を継続するのは、「トライ キャッチ (Try Catch)」アクティビティを使用します。

「トライ キャッチ (Try Catch)」は、System> Activities> Statements にあります。

トライ キャッチの構造

ペンギンさん
ペンギンさん
トライキャッチは、①Tryブロック、②Catchesブロック、③Finallyブロックの三階層で構成されます。
  • ①Tryブロック
    例外が発生する可能性のある処理を配置します。
  • ②Catchesブロック
    例外の種類に応じた処理を行います。複数種類の例外を配置することも可能です。
  • ③Finallyブロック
    例外発生の有無に関わらず、最終的に行う処理を配置します
ラッコくん
ラッコくん
①Tryブロックで例外が発生した場合、②Catchesブロックで例外の種類に当てはまる処理が行われ、③Finallyブロックが処理されるよ。
ペンギンさん
ペンギンさん
①Tryブロックで例外が発生しない場合、②Catchesブロックはスキップされ、③Finallyブロックのみ処理されます。

 

トライ キャッチの設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 共通 表示名 アクティビティの表示名です。
その他
プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。

 

サンプルプロセス
文字を整数へ変換して例外を発生させ、Catchesでエラーメッセージをログへ出力し、Finallyで終了メッセージをログへ出力する。
・Tryブロック

・Catchesブロック

・Finallyブロック

・実行結果

 

任意のタイミングで例外を発生(スロー)

任意のタイミングで例外を発生させる場合、「スロー(Throw)」アクティビティを使用します。

「スロー(Throw)」は、System> Activities> Statements にあります。

スローの設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 共通 表示名 アクティビティの表示名です。
その他
例外 アクティビティによってスローされた例外。
プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。

サンプルプロセス
スローでエラーを発生させ、Catchesでエラーメッセージをログへ出力し、Finallyで終了メッセージをログへ出力する。
・Tryブロック

-スローのプロパティ

ラッコくん
ラッコくん
例外部分に「new <例外名>」を設定することで、任意のエラー種類を発生させることができるよ。

 

・Catchesブロック

・Finallyブロック

・実行結果

 

例外の種類に応じた例外処理

主な例外一覧

例外の種類 例外の説明
System.Exception すべての例外(エラー)
System.ArgumentException 渡された引数のいずれかが無効
System.NullReferenceException nullオブジェクト参照時の例外
System.IO.IOException I/O エラーが発生したときの例外
System.InvalidOperationException 無効なメソッド呼び出し例外
System.IndexOutOfRangeException 境界外のインデックス使用時
SelectorNotFoundException 指定セレクターが存在しない
BusinessRuleException ビジネス例外

 

渡された引数のいずれかが無効(ArgumentException)

渡された引数のいずれかが無効の場合、System.ArgumentExceptionの例外が発生します。

 

サンプルプロセス

  1. CSVファイルをデータテーブルとして読み込み
  2. Tryブロックで存在しないデータテーブルの列名で指定
  3. CatchesブロックでArgumentExceptionの例外を拾ってエラーメッセージをログへ出力
  4. Finallyブロックでメッセージをログへ出力

・Cathesブロック

・Finallyブロック

・「CSVを読み込み」のプロパティ

・data.csvの中身

・実行結果

 

nullオブジェクト参照時の例外(NullReferenceException)

nullオブジェクトを参照した時は、System.NullReferenceExceptionの例外が発生します。

 

サンプルプロセス

  1. CSVファイルをデータテーブルとして読み込み
  2. Tryブロックで存在しないデータテーブルの行数で指定
  3. CatchesブロックでNullReferenceExceptionの例外を拾ってエラーメッセージをログ出力
  4. Finallyブロックでメッセージをログへ出力

・Catchesブロック

・Finallyブロック

・「CSVを読み込み」のプロパティ

・data.csvの中身

・実行結果

 

 

I/O エラーが発生したときの例外(IO.IOException)

I/O エラーが発生したときは、System.IO.IOExceptionの例外が発生します。

 

サンプルプロセス

  1. Tryブロックでテキストファイルを削除
  2. CatchesブロックでIOExceptionの例外を拾ってエラーメッセージをログ出力
  3. Finallyブロックでメッセージをログへ出力

・Catchesブロック

・Finallyブロック

・「削除」のプロパティ

・実行結果
「Data\test.txt」ファイルを開いた状態でプロセスを実行

ラッコくん
ラッコくん
別のプロセスでファイルを開いているため、削除に失敗して、IOExceptionが発生しているよ。

 

無効なメソッド呼び出し例外(InvalidOperationException)

無効なメソッド呼び出した場合は、System.InvalidOperationExceptionの例外が発生します。

 

サンプルプロセス

  1. List型の変数をNew
  2. TryブロックでList型変数のlist1の最初の値をログへ出力
  3. CatchesブロックでInvalidOperationExceptionの例外を拾ってエラーメッセージをログへ出力
  4. Finallyブロックでメッセージをログへ出力

・Catchesブロック

・Finallyブロック

・実行結果

ペンギンさん
ペンギンさん
List型変数のlist1には、何も入っていないので、最初(First)の値を指定すると、InvalidOperationExceptionが発生します。

 

境界外のインデックス使用時(IndexOutOfRangeException)

境界外のインデックスを指定した場合、System.IndexOutOfRangeExceptionが発生します。

 

サンプルプロセス

  1. Array型の変数へ{10,20,30}を代入
  2. TryブロックでArray型の変数に存在しないインデックス番号を指定
  3. CatchesブロックでIndexOutOfRangeExceptionの例外を拾ってエラーメッセージをログへ出力
  4. Finallyブロックでメッセージをログへ出力

・Catchesブロック

・Finallyブロック

・実行結果

 

指定セレクターが存在しない(SelectorNotFoundException)

指定セレクターが存在しない場合、SelectorNotFoundExceptionが発生します。

 

サンプルプロセス

  1. TryブロックでYahooトップページの検索窓をクリック
  2. CatchesブロックでSelectorNotFoundExceptionの例外を拾ってエラーメッセージをログへ出力
  3. Finallyブロックでメッセージをログへ出力

・Catchesブロック

・Finallyブロック

・「クリック ‘STRONG’」のプロパティ

・実行結果
※IEブラウザを開かずにプロセスを実行

 

 

無効なキャストや変換の例外(InvalidCastException)

無効なキャストまたは明示的な変換をした場合、System.InvalidCastExceptionが発生します。

 

サンプルプロセス

  1. Tryブロックで文字aをInt型へ変換
  2. CatchesブロックでInvalidCastExceptionの例外を拾ってエラーメッセージをログへ出力
  3. Finallyブロックでメッセージをログへ出力

・Catchesブロック


・実行結果

 

 

ビジネス例外処理(BusinessRuleException)

業務上、エラーを発生させたい場合、BusinessRuleExceptionをスローします。

 

サンプルプロセス

  1. TryブロックでBusinessRuleExceptionをスロー
  2. CatchesブロックでBusinessRuleExceptionの例外を拾ってエラーメッセージをログへ出力
  3. Finallyブロックでメッセージをログへ出力

・Catchesブロック

・Finallyブロック

・「スロー」のプロパティ

・実行結果

 

例外発生時の記録

スクリーンショットを撮る (Take Screenshot)

エラーの発生画面を特定したい場合は、「スクリーンショットを作成 (Take Screenshot)」と「画像を保存 (Save Image)」を使用して、エラー画面を保存してます。

「スクリーンショットを作成 (Take Screenshot)」は、UI Automation>要素>属性 にあります。

「画像を保存 (Save Image)」は、UI Automation>画像>ファイル にあります。

 

スクリーンショットを作成の設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 共通 表示名 アクティビティの表示名です。
エラー発生時に実行を継続 アクティビティが例外をスローした場合でも、ワークフローを継続するかどうかを指定します。
出力 スクリーンショット 結果として得られるスクリーンショットです。
オプション 待ち時間 指定した UI 要素のスクリーンショットを取得する前の遅延時間 (ミリ秒単位) です。
その他
プライベート ンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。
セレクター クティビティの実行時に特定の UI 要素の検索に使用する Text プロパティです。
タイムアウト(ミリ秒) エラーがスローされる前にアクティビティが実行されるまで待機する時間 (ミリ秒単位) を指定します。
準備完了まで待機 アクションを実行する前に、ターゲットが準備完了になるまで待ちます。
要素 別のアクティビティから返される UiElement 変数を使用します。
クリッピング領域 UiElement を基準とし、左、上、右、下の方向で、クリッピング四角形 (ピクセル単位) を定義します。

 

画像を保存の設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 共通 表示名 アクティビティの表示名です。
エラー発生時に実行を継続 アクティビティが例外をスローした場合でも、ワークフローを継続するかどうかを指定します。
入力 ファイル名 画像を保存するファイルの完全なパスと名前です。
画像 ディスクに保存する画像です。
その他 プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。

 

サンプルプロセス

  1. トライキャッチのTryブロックでYahooトップの検索窓をクリックする(プロセス実行時、Yahoo路線情報の画面を開いておき、SelectorNotFoundExceptionを発生させる)
  2. Cathesブロックで、エラーメッセージをログへ出力、スクリーンショットを日付と日時付きのファイル名で保存する。
  3. Finallyブロックで、メッセージをログへ出力する

・Catchesブロック

・Finallyブロック

・「クリック」のプロパティ

・「スクリーンショットを作成」のプロパティ

・「文字列型へ日付と時刻を代入」のプロパティ

 

・「画像を保存」のプロパティ

・変数

・実行結果

・スクリーンショットの画像ファイル出力先

・スクリーンショットの画像

ペンギンさん
ペンギンさん
日付と時刻の取得の詳細については、日付や時間の取得 のリンク先を参照してください。

 

メッセージをログ (Log Message)

エラーレベルとメッセージをログへ出力するのは、「メッセージをログ (Log Message)」を使用します。

「メッセージをログ (Log Message)」は、プログラミング>デバッグ にあります。

 

メッセージをログの設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 ログ メッセージ ログに出力するメッセージです。
レベル ログに出力するメッセージの重要度レベルです。
共通 表示名 アクティビティの表示名です。
その他 プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。

 

UiPath のログ レベル

ログレベル 既定のログ 選択基準例
Off なし
Critical Critical レベル以上で記録されたすべてのメッセージ。
Error Error レベル以上で記録されたすべてのメッセージ。 エラー発生時
Warning Warning レベル以上で記録されたすべてのメッセージ。 正常実行ではないが、処理継続可能な場合
Information Information レベル以上で記録されたすべてのメッセージ。 処理開始や終了、処理データのインデックス出力など
Trace Trace レベル以上で記録されたすべてのメッセージ。 デバッグ時のみ出力したい場合
Verbose Trace レベルで記録されたすべてのメッセージとワークフロー トラッキング ログ。

 

サンプルプロセス
各レベルのログメッセージを出力する。

・実行結果

 

例外発生時に再度処理(リトライスコープ)

処理中に例外が発生した際、再度同じ処理を行いたい場合は、「リトライ スコープ (Retry Scope)」アクティビティを使用します。

「リトライ スコープ (Retry Scope)」は、ワークフロー> 制御 にあります。

リトライスコープの構造

ペンギンさん
ペンギンさん
リトライスコープは、①アクションブロック、②条件ブロックの2階層で構成されます。
  • ①アクションブロック
    再試行するアクティビティを配置します。
  • ②条件ブロック
    再試行するか判定するために。Boolean 値を返すアクティビティを配置します
    (例:要素の有無を検出 (Element Exists)、画像の有無を確認 (Image Exists)、テキストの有無を確認 (Text Exists)])

 

リトライ スコープの設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 オプション リトライの回数 シーケンスをリトライする回数です。
リトライの間隔 各リトライの合間の時間 (秒数) を指定します。
共通 表示名 アクティビティの表示名です。
エラー発生時に実行を継続 アクティビティが例外をスローした場合でも、ワークフローを継続するかどうかを指定します。
その他 プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。
ラッコくん
ラッコくん
[リトライの回数]で指定した回数に達するか、例外が発生しない&条件ブロックがTrueを返す まで処理を繰り返すよ。

 

サンプルプロセス
Yahooトップページの検索窓に対して、クリックと要素検出が成功するか、5回失敗するまで、処理を繰り返す。

・「リトライスコープ」のプロパティ

ペンギンさん
ペンギンさん
リトライ回数を5回、リトライの間隔を3秒に設定しています。

 

・「クリック」のプロパティ

ラッコくん
ラッコくん
タイムアウト(ミリ秒)を100ミリ秒に設定しているよ。※何も設定しない場合は、30000ミリ秒(30秒)

 

・「要素の存在を確認」のプロパティ

ペンギンさん
ペンギンさん
クリックと同様に、タイムアウト(ミリ秒)を100ミリ秒に設定しています。

 

 

・設定変数

・対象のサイト(Yahooのトップページ)

・実行結果
※実行後、8秒経過してからYahooトップページを表示

ラッコくん
ラッコくん
リトライスコープ内の処理を3回目で抜けているよ。

 

上位のワークフローでエラーハンドリング(再スロー)

例外発生時、上位のワークフローでエラーハンドリングを行う場合、「再スロー (Rethrow)」を使用します。

「再スロー (Rethrow)」は、System> Activies> Statements にあります。

 

再スローの設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 共通 表示名 アクティビティの表示名です。
その他 プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。

 

サンプルプロセス

  1. 上位ワークフローのTryブロックでワークフロー ファイルを呼び出し
  2. 下位のワークフローのTryブロックで、BusinessRuleExceptionをスロー
  3. 下位のワークフローのCatchesブロックで、再スロー
  4. 上位のワークフローのCatchesブロックで、エラーメッセージを出力
  5. 上位のワークフローのFinallyブロックで、メッセージを出力

・上位ワークフローのCatchesブロック

・上位のワークフローのFinallyブロック

・下位ワークフロー

・下位ワークフローのCatchesブロック

・下位ワークフローの「スロー」のプロパティ

・実行結果

ペンギンさん
ペンギンさん
下位ワークフローのCatchesで再スローしているため、下位ワークフローのFinallyは実行されず、上位ワークフローのCathcesとFinallyが実行されます。

 

例外発生時に処理終了(ワークフローを終了する)

例外発生時にワークフローを終了させるのは、「ワークフローを終了」を使用します。

「ワークフローを終了」は、System> Activites> Statements にあります。

 

ワークフローを終了の設定項目

設定場所 設定項目 設定内容
[プロパティ] パネル内 共通 表示名 アクティビティの表示名です。
その他 プライベート オンにした場合、変数および引数の値が Verbose レベルでログに出力されなくなります。
例外 インスタンスの終了を引き起こした例外を取得または設定します。
理由 ワークフローインスタンスの終了理由を含む文字列入力引数。

 

サンプルプロセス

  1. Tryブロックで、文字をint型へ変換して例外を発生させる
  2. Catchesブロックで、エラーメッセージを出力した後、ワークフローを終了させる

・Catchesブロック

・Finallyブロック

・「ワークフローを終了」のプロパティ

・実行結果

・実行結果のログ

ラッコくん
ラッコくん
Catchesブロックでワークフローを終了しているので、Finallyブロックのログ出力は実行されていないよ。

 

例外発生時に処理を継続

アクティビティで例外が発生した場合に処理を継続したい場合、特定アクティビティのプロパティにある「エラー発生時に実行を継続」のチェックをTrueにします。

ペンギンさん
ペンギンさん
「エラー発生時に実行を継続」が空白の場合、既定のFalseが適用されます。

 

「エラー発生時に実行を継続」のプロパティが存在するアクティビティの例は、「クリック (Click)」「テキストを取得 (Get Text)」、構造化データを抽出 (Extract Structured Data)です。

 

まとめ

  • 例外は、システムやネットワークなど技術的な問題で発生するアプリケーション例外と、業務的な観点でデータに不備があるビジネス例外に分かれます
  • トライキャッチは、エラーが発生する可能性のある処理を配置するTryブロック、例外の種類に応じたエラー処理を行うCatchesブロック、最終的に行う処理を配置するFinallyブロックに分かれます
  • 任意のタイミングで例外を発生させる場合は、スローを使用します。
  • 例外発生時に再度処理を行いたい場合は、リトライスコープを使用します。

 

最後に関連記事を紹介します。

↓UiPath Studioのプロセス作成方法、アクティビティの使い方、開発時のチップスを網羅的に説明した記事です。

【UiPath】プロセス作成方法やアクティビティの使い方のまとめ記事UiPath Studioでのプロセス作成方法やアクティビティの使い方を体系的に学びたい方向けに、UiPath Studioのプロセス作成方法、アクティビティの使い方、開発時のチップスを分かりやすく説明します。...

https://penrako.com/uipathstudiosummary/(別ウインドウ)

 

↓RPAエンジニアの仕事内容、必要なスキル、将来性、IT未経験でもなれるのか、について解説した記事です。

RPAエンジニアへ転職  必要スキル、将来性、仕事内容、未経験OK?を解説 上記の疑問を持つ方向けに、RPAの開発や運用に携わる私が、RPAエンジニアの 仕事内容 必要なスキル 将来...

https://penrako.com/rpaengineer/(別ウインドウ)