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
ObjectDisposedExceptionmás específico. (Ese sigue siendo un subtipo deInvalidOperationException).
- Como señaló Martin Liversage, en el caso de que un objeto haya sido eliminado, se debe usar el tipo
La aplicación práctica de estas reglas en ese caso sería la siguiente:
- Si
isReadOnlysolo 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 usarNotSupportedException. - Si
isReadOnlypuede cambiar durante el tiempo de vida del objeto, se debe usarInvalidOperationException.- Sin embargo, el punto de
InvalidOperationExceptionvsNotSupportedExceptiones realmente irrelevante en el caso de implementar una colección, dada la descripción deIsReadOnlyen MSDN, el único comportamiento permitido paraIsReadOnlyes 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.
- Sin embargo, el punto de