1

私のアプリケーションでは、数回ArgumentNullExceptionスローされますが、パラメーター名が指定されていません。これは本番環境でのみ発生しています (javascript によって呼び出されるスクリプト サービスで例外がスローされます)。StackTrace が指すコード スニペットでこの種のエラーを再現しようとしましたが、ArgumentNullException再現できたすべてのメッセージにパラメーター名が含まれていました。

それで、私の質問は、ArgumentNullExceptionパラメータ名が指定されていないときにいつスローされるか知っている人はいますか? またはどのメソッドが最終的にこの例外をトリガーする可能性がありますか?



スクリプト サービスは、アプリケーション キャッシュからいくつかの情報を取得するためのものです。

private Dictionary<int, MyType> CachedDictionary
{
    get
    {
        //return the Item from the application cache
        return GetItem() as Dictionary<int, MyType>;
    }
    set
    {
        //adds the Item to the application cache 
        //with sliding expiration of X minutes
        AddItem(value);
    }
}

public List<MyType> Get(List<int> idsToRead)
{
    List<int> idsNotCached = idsToRead.Except<int>(CachedDictionary.Keys.ToList<int>()).ToList<int>();
    if (idsNotCached.Count > 0)
    {
        //Exception stack trace points to next line:
        MyTypeCollection DBitems = BusinessLayer.StaticLoadFromDB(idsNotCached); 
        lock (CachedDictionary)
        {
            foreach (MyType item in DBitems)
                if (!CachedDictionary.ContainsKey(item.ID))
                    CachedDictionary.Add(item.ID, item);
        }
    }
    return CachedDictionary.Where(p => idsToRead.Contains(p.Key)).Select(p => p.Value).ToList<MyType>();
}


public static MyTypeCollection StaticLoadFromDB(List<int> ids)
{
    try
    {
        //load from db...
    }
    catch (Exception e)
    {
        return HandleException<MyType>(e);
        //returns MyTypeCollection with HasError set to TRUE and defined ErrorMessage
    }
}
4

4 に答える 4

2

コードがなければ、考えられる原因を特定することは困難です。次の一般的なガイドラインを試して、問題を特定することができます。

例外ArgumentNullExceptionは通常、メソッドへの引数が指定されていない場合にトリガーされます。コンストラクター to にArgumentNullExceptionは、パラメーター名を指定する必要はありません。一部のメソッドはパラメーターを 1 つしかとらないため、null であるパラメーターの名前を指定する必要はありません。

例外は、コード内の任意の時点でトリガーできます。

throw new ArgumentNullException();

問題の原因によって場所を特定するには、スタック トレースを調べてから、指定されているパラメーターを調べる必要があります。プロセスがその時点で何をしようとしていたかを特定し、可能なパラメータ値を特定してください。

または、メソッドが呼び出されたときにメソッドに送信される可能性のある値をログに記録する try catch を追加してみることができます。例えば、

try
{
    FunctionThatThrowsArgumentNullException(myParameter);
} catch (ArgumentNullException ane)
{
    Log.WriteLine("Argument Null Exception Raised", ane);
    Log.WriteLine("Parameters supplied : {0}", myParameter);
    throw; // Pass the exception on, as we are only logging
}
于 2013-09-20T10:13:51.543 に答える
2

ArgumentNullException は公開されており、誰でもこの例外をスローできます。同僚、または使用しているサードパーティのライブラリがスローする可能性があります。

例外のスタック トレースを見て、独自の質問に答える必要があります。これにより、例外がスローされた場所と、その前にあるすべてのメソッドがわかります。

例として、次のコードを取り上げます。 ここに画像の説明を入力

例外を検査することで、エラーの発生元を確認できます。スタック トレースの一番上にあるのは、例外をスローしたメソッドであり、次にそれにつながる一連のメソッド呼び出しです。 ここに画像の説明を入力

于 2013-09-20T10:17:17.273 に答える
0

サードパーティのライブラリを使用していないと述べたように、独自のコードベースから例外がスローされる可能性があります。カミが説明したように、この例外を発生させるコードは次のように識別できます。

throw new ArgumentNullException();

コードベースでこの行を検索してみませんか? 運が良ければ、パラメーター名を渡さずにこの例外が発生する場所を見つけることができます!

于 2013-09-20T11:14:00.997 に答える