Подтвердить что ты не робот

Когда использовать InvalidOperationException или NotSupportedException?

Я реализую реализацию пользовательской коллекции, которая может быть либо readonly, либо not-readonly; то есть все методы, которые изменяют вызов коллекции, являются моральным эквивалентом:

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

Я не уверен, какой из NotSupportedException или InvalidOperationException я должен использовать в этом случае.

4b9b3361

Ответ 1

У MSDN только один бит руководства по этой точной теме, NotSupportedException:

Для сценариев, где иногда возможно, чтобы объект выполнил запрошенную операцию, и состояние объекта определяет, можно ли выполнить операцию, см. InvalidOperationException.

Далее следует только моя собственная интерпретация правила:

  • Если состояние объекта может измениться, так что операция может стать недействительной/действительной во время жизни объекта, тогда следует использовать InvalidOperationException.
  • Если операция всегда недействительна/действительна в течение всего жизненного цикла объекта, то следует использовать NotSupportedException.
  • В этом случае "время жизни" означает "все время, когда кто-либо может получить ссылку на объект", то есть даже после вызова Dispose(), который часто делает большинство других методов экземпляра непригодными;
    • Как указывал Мартин Ливергаж, в случае объекта, который был удален, следует использовать более конкретный тип ObjectDisposedException. (Это все еще подтип InvalidOperationException).

Практическое применение этих правил в этом случае будет следующим:

  • Если isReadOnly можно установить только в момент создания объекта (например, аргумент конструктора) и никогда в любое другое время, тогда следует использовать NotSupportedException.
  • Если isReadOnly может меняться в течение всего жизненного цикла объекта, тогда следует использовать InvalidOperationException.
    • Тем не менее, точка InvalidOperationException против NotSupportedException на самом деле спорным в случае реализации коллекции - данное описание isReadOnly в MSDN, единственным допустимым поведением для isReadOnly является то, что его значение никогда не изменяется после инициализации коллекции. Это означает, что экземпляр коллекции может быть модифицируемым или доступным только для чтения, но он должен выбрать один при инициализации и придерживаться его на всю оставшуюся жизнь.