◆結論
うほーーーーー!が出力される。
◆なんの話だよ
以下のリストをごらんくださぁい。
private static void Main()
{
var hoge = new List<int> { 1 };
var fuga = Enumerable.Empty<int>();
try
{
fuga = hoge.Select(x =>
{
throw new Exception("こらーーーー!");
return 0;
});
}
catch (System.Exception)
{
Console.WriteLine("ほげーーーーー!");
}
try
{
fuga.Any();
}
catch (System.Exception)
{
Console.WriteLine("うほーーーーー!");
}
Console.ReadLine();
}
このコードでは うほーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー! が出力されるのですね。
◆解説
try-catchの動きの話です。
throw new Exception("こらーーーー!");
といった風に、10行目で例外を発火しているな。そして、それはtry-catchで囲まれている。そしてcatchには
Console.WriteLine("ほげーーーーー!");
と書かれている。でも、ほげー!が出力されない。このtry-catchは例外を引っかけることが出来ない。I can’t handle itなんですわ。
◆オイオイオイ
壊れるわコードと思いきや、なんと
fuga.Any();
を囲んでるtry-catchが うほー!してくれました。
なんで?
◆遅延評価
だからです。
評価される行をtry-catchしなさい。今回で言うと「.Any()」が呼ばれるまで fuga の中身は評価されないもんで、例外の発生位置も変わってくる。
別の対処としては、👇みたいな感じに遅延評価を正格評価にしてしまうとか。
private static void Main()
{
var hoge = new List<int> { 1 };
var fuga = Enumerable.Empty<int>();
try
{
fuga = hoge.Select(x =>
{
throw new Exception("こらーーーー!");
return 0;
}).ToList();
}
catch (System.Exception)
{
Console.WriteLine("ほげーーーーー!");
}
try
{
fuga.Any();
}
catch (System.Exception)
{
Console.WriteLine("うほーーーーー!");
}
Console.ReadLine();
}
hoge.Select()の後に「.ToList()」がくっついてんね。コレは正格評価だよ。
これを実行すると ほげー!になるお!
◆結論(にかいめ)
DateTimeのAdd系にTryシリーズが欲しい。加算できるかどうか手軽に判定したい。なんか疲れたからArgumentOutOfRangeExceptionをtry-catchした。大量データじゃなかったからよかったけども、Exceptionは処理不可が高いんで多用は禁物の玉筋ですね。
コメントを残す