常にfalseを返す例外フィルタを定義することは奇妙に思えるかもしれないが、そうすべき理由がある。例外フィルタはスタックの一部として実行されるので、スタックが破棄される前に実行されるのだ。
これを利用すると、以下のように、例外の詳細な情報をログに書き込むことができる。
public static void Main()
{
var failures = 0;
var data = default(string);
while (data == null)
{
try
{
data = MakeWebRequest();
}
catch (Exception e) when (ConsoleLogException(e))
{
}
catch (TimeoutException e) when (failures++ < 10)
{
WriteLine("Time out error: trying again");
}
}
}
public static bool ConsoleLogException(Exception e)
{
var oldColor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;
WriteLine($"Error {e}");
Console.ForegroundColor = oldColor;
return false;
}
private static string MakeWebRequest()
{
throw new TimeoutException();
}
以上で、『Effective C#』の第3版、読了です。C#は仕様の大きな言語で、それなりの歴史もあるので、同じことをするにも複数の書き方ができます。典型的な例はローカル変数の定義で、型を明示的に指定することもできれば、型推論に任せることもできます。初心者のうちは、どちらの書き方を使えばいいのかわかりませんでした。
本書には、そういったC#を書く上での迷いどころや落とし穴の回避方法がまとめられています。『やさしいC#』等の入門書を読んだ後、2冊目ないし3冊目あたりで読むと良いと思いました。
ちなみに、『Effective C#』の類書として『実戦で役立つ C#プログラミングのイディオム/定石&パターン』があります。こちらは入門書の次に読んでも大丈夫なくらいの内容で、C#で何かをしたいときに役立つ書き方が「イディオム」としてまとめられています。