◆結論
うほーーーーー!が出力される。
◆なんの話だよ
以下のリストをごらんくださぁい。
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は処理不可が高いんで多用は禁物の玉筋ですね。
コメントを残す