34

次のコードは、重複するコレクションアイテムの追加を防ぐために例外をスローする必要があります。

ICollection<T> collection = new List<T>();

public void Add(T item)
{
    if (collection.Contain(item))
    {
          throw new SomeExceptionType()
    }

    collection.Add(item);
}

どの標準例外タイプが最も適切ですか?

4

8 に答える 8

42

まあ、そのようなキーがすでに存在する場合はDictionary<,>.Add()スローArgumentExceptionされるので、これは前例になると思います。

于 2009-08-14T20:35:48.690 に答える
6

ArgumentExceptionがおそらく最適でしょう。これは、引数が無効な場合にスローされる例外です。

于 2009-08-14T20:35:19.330 に答える
4

私は使用しますInvalidOperationException

メソッド呼び出しがオブジェクトの現在の状態に対して無効である場合にスローされる例外。

引数の値の有効性は、オブジェクトの状態 (つまり、真であるかどうか) に左右されるため、collection.Contains(item)これを使用するのが最善の例外であると思います。

呼び出し元に問題が何であったかを明確にする、適切なメッセージを例外に追加してください。

于 2009-08-14T20:35:06.240 に答える
3

ArgumentException は適切な例外です (辞書もその例外を使用します)

于 2009-08-14T20:35:33.883 に答える
1
System.ArgumentException
于 2009-08-14T20:35:37.037 に答える
1

InvalidOperationExceptionコレクションに既にあるオブジェクトを追加することは有効ではないため、

于 2009-08-14T20:36:01.217 に答える
1

ArgumentException をスローします。それが、ジェネリックSystem.Collections.Generic.SortedList<>がそのAddメソッドで行うことです。

.NET Framework 2.0 コードから:

    public void Add(TKey key, TValue value)
    {
        if (key == null)
        {
            System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.key);
        }
        int num = Array.BinarySearch<TKey>(this.keys, 0, this._size, key, this.comparer);
        if (num >= 0)
        {
            System.ThrowHelper.ThrowArgumentException(System.ExceptionResource.Argument_AddingDuplicate);
        }
        this.Insert(~num, key, value);
    }
于 2009-08-14T20:37:40.340 に答える