当使用InvalidOperationException异常或NotSupportedExcepti

2019-08-01 01:51发布

我实现自定义集合的实现,可以是只读或非只读; 也就是说,所有的改变集合调用一个函数是道德等价的方法:

private void ThrowIfReadOnly() {
    if (this.isReadOnly)
       throw new SomeException("Cannot modify a readonly collection.");
}

我不知道它的NotSupportedExceptionInvalidOperationException我应该在这种情况下使用。

Answer 1:

在MSDN只有在这种精确制导的话题之一位,上NotSupportedException

对于场景中它有时是可能的对象来执行所请求的操作,并且对象状态确定是否可以执行的操作,请参阅InvalidOperationException

接下来纯粹是我自己的规则的解释:

  • 如果对象的状态可以改变,这样的操作可以成为对象的生命周期过程中的无效/有效,则InvalidOperationException应该被使用。
  • 如果整个对象的生命周期内的操作总是无效/有效的,那么NotSupportedException应该被使用。
  • 在这种情况下,“终生”的意思是“整个时间,任何人都可以获取到对象的引用” -也就是,即使之后Dispose()调用,往往使得大多数其他实例方法不可用;
    • 如由Martin Liversage指出的那样,在一个对象的情况下,已被设置时,更具体ObjectDisposedException应使用类型。 (这仍然是一个亚型InvalidOperationException )。

在这种情况下,这些规定的实际应用情况如下:

  • 如果isReadOnly只能在时刻当对象被创建(例如,构造函数的参数),并且从未在任何其它时间设置,那么NotSupportedException应该被使用。
  • 如果isReadOnly可以在该对象的寿命期间改变,那么InvalidOperationException应该被使用。
    • 然而,点InvalidOperationException VS NotSupportedException在执行一个集合的情况下,实际上是实际意义-给出的说明IsReadOnly MSDN上,为唯一允许的行为IsReadOnly是集合初始化后其值永远不会改变。 这意味着一个集合实例可以是修改或只读 - 但它应该选择一个在初始化,并且坚持使用其一生的其余部分。


文章来源: When to use InvalidOperationException or NotSupportedException?