◆結論

うほーーーーー!が出力される。

◆なんの話だよ

以下のリストをごらんくださぁい。

        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は処理不可が高いんで多用は禁物の玉筋ですね。