古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

ArgumentOutOfRangeException

メッセージ一覧を生成中に発生するようです。
私の環境下では再現できなかったので、環境に依存しているのかなあなんて思っています。
どういう所でエラーが起きるのかわからないので、ちょっと調べたところこんな記事を見つけました。
例外をスローしている箇所が極端に少ないコードは要注意

target が Null ならどうなるか?System.NullReferenceException がスローされて原因を突き止めるのが難しくなる。index が 負の値であったり、target の長さより大きかったらどうなるか?System.ArgumentOutOfRangeException がスローされて原因を突き止めるのが難しくなる。原因を突き止めるには、メソッド内部を詳細に知る必要が出てくる。

確かに、「インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。」なんて言われても、どこで起きてるかなんてスタックトレース上だとメソッド単位でしかわからないんですよね(汗


なのでこんな感じでぐわーと書いてみました。

if ((set.accounts[i] == null) | (mail[i] == null))
{
    throw new ArgumentNullException("i", "アカウント、またはメールボックスが null です。");
}
if (i < 0)
{
    throw new ArgumentOutOfRangeException("i", i, "i が負の値です。");
}
if (set.accounts.Count - 1 < i)
{
    throw new ArgumentOutOfRangeException("i", i, "i がアカウント数より大きい値です。");
}
if (mail.Count - 1 < i)
{
    throw new ArgumentOutOfRangeException("i", i, "i がメールボックス数より大きい値です。");
}

こんな感じのが1つのメソッドの中に3セットくらいあります…
けどデバッグのためならエンヤコラ。