visual valid name method example comment c# .net exception invalidoperationexception notsupportedexception

c# - name - Cuándo usar InvalidOperationException o NotSupportedException?



params comments c# (1)

Estoy implementando una implementación de colección personalizada que puede ser de solo lectura o no; es decir, todos los métodos que cambian la colección llaman a una función que es el equivalente moral de:

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

No estoy seguro de cuál de NotSupportedException o InvalidOperationException debo usar en ese caso.


MSDN solo tiene un poco de orientación sobre este tema preciso, en NotSupportedException :

Para escenarios donde a veces es posible que el objeto realice la operación solicitada, y el estado del objeto determina si la operación se puede realizar, vea InvalidOperationException .

Lo que sigue es puramente mi propia interpretación de la regla:

  • Si el estado del objeto puede cambiar para que la operación se vuelva inválida / válida durante la vigencia del objeto, se debe usar InvalidOperationException .
  • Si la operación siempre es inválida / válida durante toda la vida del objeto, entonces se debe usar NotSupportedException .
  • En ese caso, "duración" significa "todo el tiempo que cualquiera puede obtener una referencia al objeto", es decir, incluso después de una llamada a Dispose() que a menudo hace inutilizables la mayoría de los otros métodos de instancia;
    • Como señaló Martin Liversage, en el caso de que un objeto haya sido eliminado, se debe usar el tipo ObjectDisposedException más específico. (Ese sigue siendo un subtipo de InvalidOperationException ).

La aplicación práctica de estas reglas en ese caso sería la siguiente:

  • Si isReadOnly solo se puede configurar en el momento en que se crea el objeto (por ejemplo, un argumento de constructor) y nunca en otro momento, se debe usar NotSupportedException .
  • Si isReadOnly puede cambiar durante el tiempo de vida del objeto, se debe usar InvalidOperationException .
    • Sin embargo, el punto de InvalidOperationException vs NotSupportedException es realmente irrelevante en el caso de implementar una colección, dada la descripción de IsReadOnly en MSDN, el único comportamiento permitido para IsReadOnly es que su valor nunca cambia después de que la colección se inicializa. Lo que significa que una instancia de colección puede ser modificable o de solo lectura, pero debe elegir una en la inicialización y atenerse a ella durante el resto de su vida útil.