エラー処理を行うための基本的なアクティビティ「トライキャッチ」についてです。
1.アクティビティのプログラム名
System.Activities.Statements.TryCatch
2.説明
Studio バージョン 2.0.2.0まで
クイックアクセス: 「ツールボックス」 > 「エラーハンドリング」 > 「トライキャッチ」
Studio バージョン 2.0.3.0から
クイックアクセス: 「ツールボックス」 > 「システム」 > 「エラーハンドリング」 > 「トライキャッチ」
指定した例外をキャッチし、「エラーを通知」したり「例外を無視して実行を継続する」などの処理を行います。ワークフロー作成時での想定外な例外をハンドリングする事も可能です。
※動作を確認したコボットStudioのバージョン:2.0.1.6
※バージョンによって文言などが一部異なる場合がございます
3.プロパティ
プロパティ項目 | プロパティ名 | 入力欄 | 説明 |
---|---|---|---|
その他 | パブリック | チェック項目 | ログにアクティビティ内の変数と引数がログファイルに書き込まれ、Centerにプッシュされる。(詳細は「プロパティ項目「パブリック」について」を参照) |
表示名 | 値を入力(String型) | デザイナーパネルのアクティビティ名に反映される。 |
4.使い方
ファイル「Sample.txt」を削除し、削除できたら削除ファイルリスト「deleteFileList」に追加していくロボットを作成する場合を考えてみましょう。「削除する」アクティビティでは、対象として指定されたファイルが存在しない場合や対象ファイルが使用中の場合、例外をスローします。例外がスローされると、その時点で実行が中断されます。「削除する」アクティビティ使用より前に、削除対象のファイルが存在するかチェックを行う事で実行が中断される事を回避できますが、「トライキャッチ」アクティビティを使用する事でも、実行が中断される事のないワークフローを作成する事ができます。「トライキャッチ」アクティビティを使用し、このロボットを作成してみましょう。
まずは変数を作成します。作成する変数は以下です。※変数の作成方法については「変数の作成」を参照してください。
「targetFile」… 削除対象のファイル名を格納するString型変数。今回は規定値に「"Sample.txt"」と記述し、事前に削除対象ファイル名を格納します。
「deleteFileList」… 削除できたファイル名を格納するList<String>型の変数。規定値に「new list(of string)」と設定し生成します。
処理の開始を案内するメッセージを表示します。アクティビティ「コア > メッセージボックス」をツールボックスからデザイナーパネルにドラッグ&ドロップで配置し、アクティビティ内「テキスト」に、実行開始を案内するメッセージ「"例外処理のサンプル実行を開始します。"」を指定します。(プロパティパネルの「入力 > テキスト」からも可能です。)
アクティビティ「エラーハンドリング > トライキャッチ」を、ツールボックスからデザイナーパネルにドラッグ&ドロップで配置します。
「Try」ブロックに例外をスローする可能性がある処理を記述します。Tryブロックのアクティビティ実行で例外がスローされた場合、それ以降のTryブロックのアクティビティは実行せず「Catches」ブロックに移動します。
※ただし、記述されたアクティビティの「エラー発生時に実行を継続」プロパティ値が True の場合、例外はスローされません。
「Catches」ブロックでは、Tryブロックで発生した例外を受ける設定とその例外に対して行う処理を記述します。どのような例外が発生する可能性があるかを想定し設定する事がベストですが、すべての例外を受け止める「System.Exception」を設定すると、ワークフロー作成時に想定できなかった例外をキャッチする事ができます。
※繰り返し処理内にトライキャッチを入れ、Catchブロックにbreakアクティビティを設定した場合、Catch・Finallyブロックの処理を最後まで実行してから繰り返し処理を終了します。
「Finally」ブロックは「例外がスローされない」または「例外が発生し Catchesブロックでキャッチされた場合」に実行されるブロックです。そのためキャッチされない例外が発生した場合、このブロックは実行されません。不要な場合、Finallyブロックは未設定でも構いません。使用例としては、Tryブロックにログイン後の処理が記述してあるとします。例外がスローされず Tryブロックが終了した場合も、例外がスローされキャッチされた場合も「ログアウト」処理を行いたい場合、このブロックに記述する事でどちらの場合も「ログアウト」処理が行われます。
※繰り返し処理内にトライキャッチを入れ、Finallyブロックにbreakアクティビティを設定した場合、Finallyブロックの処理を最後まで実行してから繰り返し処理を終了します。
ファイル「Sample.txt」を削除する処理をアクティビティに設定していきます。それぞれのブロックには以下の処理を記述していきます。
Try | 「Sample.txt」を削除する処理を記述する。削除したファイルは、削除ファイルリストに追加する。 |
Catches | 「Sample.txt」の削除実行で例外が発生した場合の処理を記述する。想定として「ファイルが存在しない」「ファイルが使用中」の処理を記述する。想定外の例外に対しても考慮し記述する。 |
Finally | 削除ファイルリストの件数をメッセージボックスに表示する。 |
Try ブロック
Tryブロックにファイルの削除処理を配置していきます。アクティビティ「コントロールフロー > シーケンス」をツールボックスからデザイナーパネルの「Try」内にドラッグ&ドロップで配置します。
「シーケンス」内に削除処理を配置していきます。アクティビティ「コア > 削除する」をツールボックスからデザイナーパネルにドラッグ&ドロップで配置します。
プロパティパネルの「入力 > 対象パス」に削除したいファイル名を格納した変数名「targetFile」を指定します。
削除処理の完了を案内するメッセージを表示します。(エラー発生時は「Catches」へ移動するため、「削除する」アクティビティが正常に実行された場合のみこのアクティビティに進みます。)アクティビティ「コア > メッセージボックス」をツールボックスからデザイナーパネルにドラッグ&ドロップで配置し、アクティビティ内「テキスト」に「targetFile + "は削除しました。削除ファイルリストに追加します。"」を指定します。(プロパティパネルの「入力 > テキスト」からも可能です。)
削除したファイル名を削除ファイルリストに追加します。アクティビティ「コレクション > コレクションに追加」をツールボックスからデザイナーパネルにドラッグ&ドロップで配置します。
プロパティに以下を設定します。
「その他 > TypeArgument」… ドロップダウンリストから「String」を選択。
「その他 > コレクション」… 削除ファイルリストの変数名「deleteFileList」。
「その他 > 項目」… 削除対象ファイルの変数名「targetFile」。
Catch ブロック
「ファイルが存在しない」場合から記述していきましょう。「新しい catchの追加」をクリックします。
Exceptionのドロップダウンリストから例外の種類を選択します。「削除する」アクティビティ実行時に対象ファイルが存在しない場合、「FileNotFoundException 」が発生します。リスト内に見当たらないので「型の参照…」をクリックします。
表示されたポップアップウィンドウの「型の名前」に「file」と入力し検索します。
FileNotFoundException型がありました。クリックで選択します。
「OK」ボタンをクリックします。
FileNotFoundException をキャッチする準備ができました。キャッチした場合に行いたい処理を記述していきます。青枠はキャッチしたエラーを格納する変数です。変数名は変更することもできます。「fileNotFoundEx」に変更しておきましょう。
メッセージボックスでエラーを通知するようにします。今回のメッセージ内容は、キャッチしたエラー情報を利用する事にします。エラーを格納した変数を使用しましょう。配置したメッセージボックスのアクティビティ内「テキスト」に、「"【FileNotFoundException】" + vbNewLine + fileNotFoundEx.Message + vbNewLine + "ファイル名:" + fileNotFoundEx.FileName」を指定します。
これで「ファイルが存在しない」場合の例外発生をキャッチする記述は完了です。同じように「ファイルが使用中」の場合を記述していきましょう。FileNotFoundExceptionを設定した手順を参考に「新しい catchの追加」をクリックし、「IOException」をキャッチするよう準備します。
FileNotFoundException をキャッチした場合と同じように、キャッチしたエラー情報を利用し、メッセージボックスでエラーを通知するようにします。変数名を「IoEx」に変更後、配置したメッセージボックスのアクティビティ内「テキスト」に、「"【IOException】" + vbNewLine + IoEx.message」と指定します。
最後に想定外のエラーがあった場合に備え、発生した例外すべてをキャッチするブロックを設定します。「新しい catchの追加」をクリックし、「Exception」をキャッチするよう準備します。
FileNotFoundException をキャッチした場合と同じように、キャッチしたエラー情報を利用し、メッセージボックスでエラーを通知するようにします。変数名はデフォルトの「exception」のまま、配置したメッセージボックスのアクティビティ内「テキスト」に、「 "【Exception】" + vbNewLine + exception.Message 」と指定します。
Finally ブロック
ファイルが削除された場合も例外がキャッチされた場合も、メッセージボックスに削除ファイルリストの件数を表示します。「Finally」をクリックします。
Finally ブロックです。ここに処理を記述していきます。
配置したメッセージボックスのアクティビティ内「テキスト」に「"【Finally】" + vbNewLine + "削除ファイルリストの件数:" + deleteFileList.Count.ToString + "件"」と指定しています。
これで「トライキャッチ」アクティビティの設定は完了です。最後に終了を案内するメッセージボックスを表示します。配置したメッセージボックスアクティビティ内「テキスト」に、実行終了を案内するメッセージ「"例外処理のサンプル実行を終了します。"」を指定します。
「ホーム > スタート」をクリック、または、「F5キー」押下で実行します。
実行結果です。今回はトライキャッチを理解するために複数のキャッチブロックを設定しました。実行前の状態別に実行結果を確認していきます。
削除対象ファイルが存在する場合
●実行前
●実行結果
開始メッセージ
Try ブロック
catch ブロック
※例外が発生しないため実行されません。
Finally ブロック
終了メッセージ
削除対象ファイルが使用中の場合
●実行前
●実行結果
開始メッセージ
Try ブロック
※「削除する」アクティビティで例外が発生するため、メッセージボックスは表示されません。
catch ブロック
Finally ブロック
終了メッセージ
削除対象ファイルが存在しない場合
●実行前
●実行結果
開始メッセージ
Try ブロック
※「削除する」アクティビティで例外が発生するため、メッセージボックスは表示されません。
catch ブロック
Finally ブロック
終了メッセージ