プログラミングBlog

C#

Exceptionクラスについて①

他の方が担当していた再現できないエラーのため問題なしとして処理されてしまった不具合をもう一度調査してくださいと言われた時の話です。
手順などは詳しく書いておらず、画像の添付とログがあったので画像通りの条件で実行してみましたが確かに再現できませんでした。
不思議に思って添付されていた実行ログを見るとExcptionエラーが出ていたため調査してみました。
ArgumentOutOfRangeException : 引数の値が、呼び出されたメソッドで定義されている許容範囲外である場合にスローされる例外。

例としてはこんな感じ。

Progam.cs

var list = new List<string> { "A", "B", "C" }; // ①
Console.WriteLine(list[0]);

var emptyList = list.Where(e => string.IsNullOrEmpty(e)).ToList();  // ②
Console.WriteLine(emptyList[0]);

List<string> A = null; // ③
Console.WriteLine(A[0]);

①はリストの宣言と格納を同時に行い一つ目のリストの情報を取り出して表示させるようなプログラム。

②は①のリストからNullもしくは値が空のものをemptyListに詰めてあげる。そのためリストの中身は空になります。 その状態で[0]で一つ目のリストの情報を取り出しているため、ArgumentOutOfRangeException が発生します。

③はリストにnullを入れたあとに[0]で一つ目のリストの情報を取り出しているためNullReferenceExceptionが発生します。

感想

実際のコードはDBからテーブルのレコードを検索して、結果がない場合に[0]で参照しているため100%落ちるようなプログラムでしたが、 nullの時確実に落ちるため、非常に危険なコードでした。。。 今回の事での学びですが、Exceptionエラーについて詳しくなると何が悪いのか?がわかってくるので大事ですね! 後、手順通りできなくても問題なしと判断するのではなくじっくり検証する必要があることがよくわかりました。