6

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

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

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

4

5 回答 5

15

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

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

这应该是ArgumentException

于 2008-09-11T05:31:17.457 回答
9

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

于 2008-09-10T17:42:59.347 回答
5

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

于 2008-09-10T17:39:12.427 回答
5

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

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

...

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

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

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

于 2008-09-10T17:43:01.700 回答
1

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

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

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

任何一种方法都可以被认为是最佳实践,只要您在使用它时保持一致即可。

于 2008-09-10T17:41:23.157 回答