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 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
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 usarNotSupportedException
. - Si
isReadOnly
puede cambiar durante el tiempo de vida del objeto, se debe usarInvalidOperationException
.- Sin embargo, el punto de
InvalidOperationException
vsNotSupportedException
es realmente irrelevante en el caso de implementar una colección, dada la descripción deIsReadOnly
en MSDN, el único comportamiento permitido paraIsReadOnly
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.
- Sin embargo, el punto de