【发布时间】:2008-09-10 17:35:36
【问题描述】:
我有一个 Asset 对象,它有一个属性 AssignedSoftware,它是一个集合。
我想确保同一软件不会多次分配给资产。在 Add 方法中,我检查软件是否已经存在,如果存在,我想抛出异常。
是否有我应该抛出的标准 .NET 异常?还是最佳实践要求我创建自己的自定义异常?
【问题讨论】:
标签: c# exception collections
我有一个 Asset 对象,它有一个属性 AssignedSoftware,它是一个集合。
我想确保同一软件不会多次分配给资产。在 Add 方法中,我检查软件是否已经存在,如果存在,我想抛出异常。
是否有我应该抛出的标准 .NET 异常?还是最佳实践要求我创建自己的自定义异常?
【问题讨论】:
标签: c# exception collections
为什么InvalidOperationException 被接受为答案?!应该是ArgumentException?!
InvalidOperationException 如果对象由于未初始化状态等而无法处理请求,则应使用该对象调用它的方法/属性。这里的问题是 不是要添加到的对象,但是对象被传递给对象(这是一个骗子)。想一想,如果这个 Add 调用从未发生过,该对象是否仍能正常工作,是的!
这应该是一个ArgumentException。
【讨论】:
.Net 将抛出 System.ArgumentException 如果您尝试使用相同的键值将项目添加到哈希表两次,因此看起来没有更具体的内容。如果您需要更具体的内容,您可能需要编写自己的异常。
【讨论】:
来自错误类库设计指南 (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):
在大多数情况下,使用预定义的异常类型。只为编程场景定义新的异常类型,您希望类库的用户捕获这种新类型的异常并根据异常类型本身执行编程操作。这代替了解析异常字符串,这会对性能和维护产生负面影响。
...
如果传递或检测到无效参数,则抛出 ArgumentException 或创建从此类派生的异常。
如果在给定对象当前状态的情况下不适合调用属性集访问器或方法,则引发 InvalidOperationException 异常。
这对我来说似乎是一个“对象状态无效”的场景,所以我会选择 InvalidOperationException 而不是 ArgumentException:参数是有效的,但在对象生命周期的这一点上不是。
【讨论】:
您可能应该抛出 ArgumentException,因为这是基础库类所做的。
【讨论】:
好吧,如果你真的想要一个包含独特项目的集合,你可能想看看HashSet object(在 C# 3.0 中可用)。
否则,您可以采取两种方法:
任何一种方法都可以被认为是最佳实践,只要您在使用它时始终如一。
【讨论】: