尝试将重复项添加到集合时应该抛出什么异常类型?

时间:2009-08-14 20:31:25

标签: c# .net exception duplicates

以下代码应抛出异常以防止添加重复的集合项。

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

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

    collection.Add(item);
}

哪种标准异常类型最合适?

8 个答案:

答案 0 :(得分:32)

好吧,如果此类密钥已经存在,Dictionary<,>.Add()会抛出ArgumentException,所以我想这可能是一个先例。

答案 1 :(得分:5)

ArgumentException可能是最好的。这是参数无效时抛出的异常。

答案 2 :(得分:3)

我会使用InvalidOperationException

  

a时抛出的异常   方法调用无效   对象的当前状态。

由于参数值的有效性取决于对象的状态(即collection.Contains(item)是否为真),我认为这是最好的例外。

确保向异常添加一条好消息,以便明确调用者遇到的问题。

答案 3 :(得分:3)

Linq使用另外两个例外 DuplicateNameException DuplicateKeyException 如果您使用的是system.data程序集,则可以使用这些例外。

答案 4 :(得分:2)

ArgumentException将是正确的异常(Dictionary也使用该异常)

答案 5 :(得分:1)

System.ArgumentException

答案 6 :(得分: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);
    }

答案 7 :(得分:0)

我会说InvalidOperationException,因为添加已经在集合中的对象无效