通常のcatch
節では、例外の型に基いて捕捉を行う。例外をキャッチしたらリトライするような実装では、最終的に、例外を再度throw
することになる。このやり方では、その後の分析が難しくなる。このような場合には、例外フィルタを使うべきである。
例外フィルタは、catch
節にwhen
キーワードを重ねて使用する。
public static void Main()
{
var retryCount = 0;
var data = default(string);
while (data == null)
{
try
{
data = MakeWebRequest();
}
catch (TimeoutException e) when (retryCount++ < 3)
{
WriteLine("Operation timed out. Trying again");
Task.Delay(1000 * retryCount);
}
}
}
private static string MakeWebRequest()
{
throw new TimeoutException();
}
例外フィルタを使用すると、例外をキャッチした際にもコールスタックは破棄されないので、例外の発生した状況をあとで追いやすい。また、例外フィルタを使用したほうがパフォーマンスも良くなる。