【问题标题】:What is the correct .NET exception to throw when try to insert a duplicate object into a collection?尝试将重复对象插入集合时抛出的正确 .NET 异常是什么?
【发布时间】:2008-09-10 17:35:36
【问题描述】:

我有一个 Asset 对象,它有一个属性 AssignedSoftware,它是一个集合。

我想确保同一软件不会多次分配给资产。在 Add 方法中,我检查软件是否已经存在,如果存在,我想抛出异常。

是否有我应该抛出的标准 .NET 异常?还是最佳实践要求我创建自己的自定义异常?

【问题讨论】:

    标签: c# exception collections


    【解决方案1】:

    为什么InvalidOperationException 被接受为答案?!应该是ArgumentException?!

    InvalidOperationException 如果对象由于未初始化状态等而无法处理请求,则应使用该对象调用它的方法/属性。这里的问题是 不是要添加到的对象,但是对象被传递给对象(这是一个骗子)。想一想,如果这个 Add 调用从未发生过,该对象是否仍能正常工作,是的!

    这应该是一个ArgumentException

    【讨论】:

      【解决方案2】:

      .Net 将抛出 System.ArgumentException 如果您尝试使用相同的键值将项目添加到哈希表两次,因此看起来没有更具体的内容。如果您需要更具体的内容,您可能需要编写自己的异常。

      【讨论】:

        【解决方案3】:

        来自错误类库设计指南 (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):

        在大多数情况下,使用预定义的异常类型。只为编程场景定义新的异常类型,您希望类库的用户捕获这种新类型的异常并根据异常类型本身执行编程操作。这代替了解析异常字符串,这会对性能和维护产生负面影响。

        ...

        如果传递或检测到无效参数,则抛出 ArgumentException 或创建从此类派生的异常。

        如果在给定对象当前状态的情况下不适合调用属性集访问器或方法,则引发 InvalidOperationException 异常。

        这对我来说似乎是一个“对象状态无效”的场景,所以我会选择 InvalidOperationException 而不是 ArgumentException:参数是有效的,但在对象生命周期的这一点上不是。

        【讨论】:

        • 我确实想让 UI 开发人员有机会处理这个特定的错误......所以我要创建自己的异常类型。
        • 我不同意这个答案 - 请参阅下面的答案。
        【解决方案4】:

        您可能应该抛出 ArgumentException,因为这是基础库类所做的。

        【讨论】:

          【解决方案5】:

          好吧,如果你真的想要一个包含独特项目的集合,你可能想看看HashSet object(在 C# 3.0 中可用)。

          否则,您可以采取两种方法:

          • 如您所说,为您的操作创建一个自定义异常
          • 实现一个返回布尔结果的 Add() 方法:如果项目已添加,则为 true,如果该项目在集合中已有重复项,则为 false

          任何一种方法都可以被认为是最佳实践,只要您在使用它时始终如一。

          【讨论】:

            猜你喜欢
            • 2010-11-19
            • 1970-01-01
            • 2011-04-24
            • 1970-01-01
            • 2015-07-16
            • 1970-01-01
            • 1970-01-01
            • 2011-07-22
            • 1970-01-01
            相关资源
            最近更新 更多