タイトルの通り、UiPathではCatchブロックは下位の例外からキャッチする。この時、Catchブロックを置く順番は特に影響しない。
以下の例ではTryブロックでスローしたSystem.IO.FileNotFoundException
は、「Exception ⇒ SystemException ⇒ IOException ⇒ FileNotFoundException」と継承されるクラスなので、最も下位の例外であるSystem.IO.IOException
ブロックでキャッチされる。
前述の通りCatchブロックを置く順番は特に影響しないので、以下のように入れ替えても同じ結果になる。
ちなみにGPT-4君に尋ねると「Catchブロックは上から順に評価される」と回答が返ってきたが、これは誤り。VB.Netでは上から順に評価される仕様なので、それに引っ張られているのだろう。
Catchブロックの選択ルール
・例外は上位クラスよりも下位クラスでキャッチされる
例外が複数のCatchブロックに該当する場合、特定の例外にマッチするCatchブロックが優先されます。
より汎用的なクラス(上位クラス)のブロックは、特定の例外(下位クラス)のブロックが存在しない場合に実行されます。
・Catchブロックは上から順に評価される
TryCatchアクティビティのCatchブロックは、定義された順番に評価されます。
最初にマッチしたブロックが実行され、それ以降のブロックはスキップされます。
下位の例外をキャッチしたくない場合は?
System.IO.IOException
は拾ってほしいがSystem.IO.DirectoryNotFoundException
など下位の例外は拾ってほしくない。そういう場面があるかはわからないが、そんな時はCatchブロック内でexception変数の情報を見て判断する。
System.IO.IOException
だけ拾いたければ、CatchブロックをException
の一つに絞り、exception.GetType
メソッドで例外の型を確認してSystem.IO.IOException
の場合だけ分岐で処理を分ければいい。この形なら下位のSystem.IO.DirectoryNotFoundException
等が流れてきてもてSystem.IO.IOException
の分岐には流れない。
参考
動作環境
UiPath.System.Activities v24.10.7