何时使用InvalidOperationException或NotSupportedException?

时间:2012-10-01 08:28:48

标签: c# .net exception invalidoperationexception notsupportedexception

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

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

我不确定在这种情况下我应该使用NotSupportedExceptionInvalidOperationException中的哪一个。

1 个答案:

答案 0 :(得分:50)

MSDN在NotSupportedException

上只对这个确切的主题提供了一点指导
  

对于有时可能对象执行请求的操作并且对象状态确定是否可以执行操作的情况,请参阅InvalidOperationException

以下内容纯粹是我对规则的解释:

  • 如果对象的状态可以更改,以便操作在对象的生命周期内变为无效/有效,则应使用InvalidOperationException
  • 如果在整个对象的生命周期内操作始终无效/有效,则应使用NotSupportedException
  • 在这种情况下,“生命周期”意味着“任何人都可以获得对对象的引用” - 也就是说,即使在Dispose()调用之后,通常会使大多数其他实例方法无法使用;
    • 正如Martin Liversage指出的那样,在物体被处理的情况下,应该使用更具体的ObjectDisposedException类型。 (这仍然是InvalidOperationException)的子类型。

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

  • 如果isReadOnly只能在创建对象时设置(例如构造函数参数),并且从不在任何其他时间设置,则应使用NotSupportedException
  • 如果isReadOnly在对象的生命周期内发生变化,则应使用InvalidOperationException
    • 但是,InvalidOperationException vs NotSupportedException在实现集合的情况下实际上没有实际意义 - 鉴于MSDN上IsReadOnly的描述,{{1}的唯一允许行为在初始化集合后,它的值永远不会改变。这意味着集合实例可以是可修改的或只读的 - 但它应该在初始化时选择一个并在其生命周期的剩余时间内坚持使用它。