我总是错过了 c# 中的内置异常类型,这表明对象已损坏。在这种情况下你会扔什么?
通常当我意识到如果对象具有某种状态时应该对对象起作用的方法将失败时,我会想念它。在这种情况下,我经常怀疑这种状态可能永远不会达到。但是出于防御考虑,我想抛出一个异常以防万一(例如在未来的代码更改之后)。
对于我们拥有的方法参数ArgumentException
,我们可以拒绝无效参数。但是对于对象状态呢?在 Java 中,我会使用IllegalStateException
.
当然,您可以争辩说,实际上改变状态的方法可以检查状态的正确性。他们最好应该这样做,但如果他们不这样做(比如在传统的上帝课程中)?
编辑:
尽管InvalidOperationException
似乎是最合适的,但正如接受的答案所述(以及这个),请注意:
它很微妙,但从语义上讲,它的含义与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);
}