抛出无效对象状态的异常是什么?

Igo*_*kin 40 .net c# exception

我总是错过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); 
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 40

您应该抛出InvalidOperationException以指示对象具有无效状态.

从MSDN文档(上面链接):

方法调用对于对象的当前状态无效时引发的异常.

  • 也许它很微妙,但在语义上它有不同的含义."InvalidOperationException"表示对象的"协议"中存在问题,调用者必须遵守该问题(例如,未初始化,已关闭,......).在我的情况下,调用者没有做错任何错误,它是*被破坏的对象*.我想准确传输那条消息. (14认同)
  • @IgorLankin在这种情况下,你可能想要`Trace.Assert(someConditionThatMustBeTrue)`因为如果你的代码被破坏了,你可以抛出没有明智的例外,它会抓住它是有意义的.它实际上是一个'MyCodeIsBroken`例外! (5认同)
  • (另一个想法)你仍然应该使用`InvalidOperationException`,因为那是你应该在.Net中使用的内容(即使你有所区别,我完全理解) - 但是你可以在异常消息中确切地说出问题是什么是的,所以你不会丢失任何信息. (2认同)