web-dev-qa-db-ja.com

コレクションに重複アイテムを追加しようとすると、どの例外タイプがスローされますか?

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

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

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

    collection.Add(item);
}

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

26
klashar

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

33
Pavel Minaev

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

5
Brandon

Linqはさらに2つの例外を使用しますDuplicateNameExceptionおよびDuplicateKeyException system.dataAssemblyを使用している場合はこれらを使用できます。

4

InvalidOperationException を使用します:

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

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

発信者にとって何が問題であったかを明確にする適切なメッセージを例外に追加するようにしてください。

3
Andrew Hare

ArgumentExceptionが適切な例外になります(辞書はその例外も使用します)

2
cyberconte
System.ArgumentException
1
Ben M

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

1
Thomas Levesque

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);
    }
1
Paul Williams