【发布时间】:2013-04-29 16:49:53
【问题描述】:
我总是错过了 c# 中的内置异常类型,这表明对象已损坏。在这种情况下你会扔什么?
当我意识到如果对象具有某种状态时,应该对对象起作用的方法将失败时,我通常会想念它。在这种情况下,我经常怀疑这种状态可能永远不会达到。但是出于防御考虑,我想抛出一个异常以防万一(例如,在未来的代码更改之后)。
对于方法参数,我们有ArgumentException,所以我们可以拒绝无效参数。但是对于对象状态呢?在 Java 中,我会使用 IllegalStateException。
当然,您可以争辩说,实际上改变状态的方法可以检查状态的正确性。他们最好应该这样做,但如果他们不这样做(比如在传统的上帝课程中)?
编辑:
虽然InvalidOperationException 似乎是最合适的,但正如接受的答案所述(以及this one),请注意:
它很微妙,但在语义上它与InvalidOperationException 的含义不同。 InvalidOperationException 表示对象的“协议”中存在问题,调用者必须遵守(例如,未初始化、已关闭……)。在我的情况下,调用者没有做错任何事情,它是被破坏的对象。我想准确地传输该消息。
例子:
switch(this._someType) {
case SomeType.A: doSomething(); break;
case SomeType.B: doSomethingElse(); break;
/*...*/
default:
// Unexpected type! Someone introduced a new type and didn't update this.
throw new IllegalStateException("Unknown type "+this._someType);
}
【问题讨论】:
-
一般情况下,
InvalidOperationException。 -
请参阅我对 Matthew Watsons 关于
InvalidOperationException的回答的评论。 -
总体原则的一个更好的例子可能是尝试将一个项目
Add指向一个内部链表已损坏(例如,由于非法多线程使用)的字典对象。通常,从Add方法抛出的InvalidOperatonException表明已经添加了具有指定键的项,并且捕获此类异常的代码可能会认为这是真的。我认为,当对象的状态不适合它们时,抛出具有相关期望的类型的异常是非常糟糕的。