尝试将重复对象插入集合时,抛出的正确.NET异常是什么?

mat*_*uma 6 c# collections exception

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

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

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

Rob*_*per 13

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

InvalidOperationException如果具有被调用的方法/属性的对象由于uninit'ed状态等而无法处理请求,则应该使用此问题.这里的问题不是要添加的对象,而是传递给对象的对象(这是一个骗局).是的,如果这个Add调用从未发生过,那么该对象是否仍能正常运行,是的!

这应该是ArgumentException.


Dav*_*veK 9

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


Kri*_*son 5

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


Ada*_*ght 5

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

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

...

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

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

这对我来说似乎是一个"对象状态无效"的场景,所以我选择了对ArgumentException的InvalidOperationException:参数是有效的,但在对象生命中此时却没有.