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