CA1065: No producir excepciones en ubicaciones inesperadas
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
Identificador de comprobación |
CA1065 |
Categoría |
Microsoft.Design |
Cambio problemático |
No |
Motivo
Un método que no se espera que produzca excepciones inicia una excepción.
Descripción de la regla
Los métodos que no se espera que inicien excepciones se pueden clasificar como sigue:
Métodos Get de propiedades
Métodos de descriptor de acceso de eventos
Métodos Equals
Métodos GetHashCode
Métodos ToString
Constructores estáticos
Finalizadores
Métodos Dispose
Operadores de igualdad
Operadores de conversión implícitos
En las secciones siguientes se describe estos tipos de métodos.
Métodos Get de propiedades
En esencia, las propiedades son campos inteligentes.Por consiguiente, deberían comportarse de la forma más parecida a un campo.Los campos no inician excepciones y las propiedades tampoco deberían iniciarlas.Si usa una propiedad que inicia una excepción, considere convertirla en un método.
Las excepciones siguientes se pueden iniciar desde un método Get de propiedad:
InvalidOperationException y todos los derivados (incluido ObjectDisposedException)
NotSupportedException y todos los derivados
ArgumentException (sólo de Get indizado)
KeyNotFoundException (sólo de Get indizado)
Métodos de descriptor de acceso de eventos
Los descriptores de acceso de eventos deberían ser operaciones simples que no inicien excepciones.Un evento no debería iniciar una excepción al intentar agregar o quitar un controlador de eventos.
Las excepciones siguientes pueden iniciarse desde un descriptor de acceso de eventos:
InvalidOperationException y todos los derivados (incluido ObjectDisposedException)
NotSupportedException y todos los derivados
ArgumentException y derivados
Métodos Equals
Los métodos Equals siguientes no deberían iniciar excepciones:
Un método Equals debe devolver true o false en lugar de iniciar una excepción.Por ejemplo, si Equals pasa dos tipos que no coinciden, simplemente debe devolver false en lugar de iniciar la excepción ArgumentException.
Métodos GetHashCode
Los métodos GetHashCode siguientes normalmente no deberían iniciar excepciones:
GetHashCode siempre debe devolver un valor.De lo contrario, pueden perderse elementos de la tabla hash.
Las versiones de GetHashCode que toman un argumento pueden iniciar ArgumentException.Sin embargo, Object.GetHashCode nunca debería iniciar una excepción.
Métodos ToString
El depurador utiliza Object.ToString para ayudar a mostrar información sobre los objetos en formato de cadena.Por consiguiente, ToString no debería cambiar el estado de un objeto y no debería iniciar excepciones.
Constructores estáticos
Iniciar excepciones desde un constructor estático hace que el tipo sea inutilizable en el dominio de la aplicación actual.Debe haber una muy buena razón (como un problema de seguridad) para iniciar una excepción desde un constructor estático.
Finalizadores
Iniciar una excepción desde un finalizador hace que CLR produzca errores rápidamente y que se destruya el proceso.Por ello, siempre se debe evitar iniciar excepciones en un finalizador.
Métodos Dispose
Un método IDisposable.Dispose no debería iniciar una excepción.Dispose se llama a menudo como parte de la lógica de limpieza en una cláusula finally.Por consiguiente, iniciar explícitamente una excepción desde Dispone obliga al usuario a agregar el control de excepciones dentro de la cláusula finally.
La ruta de acceso del código de Dispose(false) nunca debería iniciar excepciones, porque casi siempre se le llama desde un finalizador.
Operadores de igualdad (==, !=)
Como los métodos Equals, los operadores de igualdad deberían devolver true o false y no iniciar excepciones.
Operadores de conversión implícitos
Dado que el usuario a menudo no advierte que se ha llamado a un operador de conversión implícito, una excepción iniciada por el operador de conversión implícito es completamente inesperada.Por consiguiente, no se debería iniciar ninguna excepción desde los operadores de conversión implícitos.
Cómo corregir infracciones
En los métodos Get de propiedades, cambie la lógica para que no necesite iniciar una excepción o sustituya la propiedad por un método.
En todos los demás tipos de métodos mostrados anteriormente, cambie la lógica de manera que no sea necesario iniciar una excepción.
Cuándo suprimir advertencias
Es seguro suprimir una advertencia de esta regla si la infracción la produjo una declaración de excepción en lugar de una excepción producida.
Reglas relacionadas
CA2219: No producir excepciones en cláusulas de excepción