【问题标题】:What exception type should be thrown when trying to add duplicate items to a collection? [closed]尝试将重复项添加到集合时应该抛出什么异常类型? [关闭]
【发布时间】:2010-11-19 18:49:46
【问题描述】:

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

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

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

    collection.Add(item);
}

什么标准异常类型最合适?

【问题讨论】:

  • 我发现的最接近的特定异常是DuplicateNameException 用于数据库...这对于Collection 来说是个坏主意。带回家的信息:任何想要更具体的人都可以推出自己的例外

标签: c# .net exception duplicates


【解决方案1】:

好吧,Dictionary&lt;,&gt;.Add() 抛出 ArgumentException 如果这样的密钥已经存在,所以我想这可能是一个先例。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我会使用InvalidOperationException:

        当一个 方法调用对 对象的当前状态。

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

        确保在异常中添加一条好消息,让调用者清楚问题所在。

        【讨论】:

        • 恕我直言,InvalidOperationException 会使用户感到困惑,因为它主要用于显示不适当的操作顺序。例如,从封闭式阅读器阅读等。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:
          System.ArgumentException
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 如果它是一本字典,那就是真的,但事实并非如此。
            • 有不允许重复的集合,以及允许它们的字典......在发布者的情况下,他显然不想要重复,或者他为什么要抛出异常?跨度>
            • 对不起,我的评论很糟糕,我更想说的是,如果 OP 使用的集合确实允许重复,那么它并不是一个无效的操作。这是“他不认为这是有效的”事情。另外,我不是反对这个的人>_>我不同意这是最好的例外,但我不认为使用它是错误的。
            【解决方案8】:

            我会抛出一个 ArgumentException。这就是通用 System.Collections.Generic.SortedList&lt;&gt; 在其 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);
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-05-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-01
              相关资源
              最近更新 更多