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 回答
9

Linq 使用了另外两个异常DuplicateNameExceptionDuplicateKeyException如果您使用的是 system.data 程序集,您可以使用它们。

于 2017-05-03T09:43:43.933 回答
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 回答