Una excepción es un error de bloqueo .
En primer lugar, la mejor práctica debería ser no lanzar excepciones para ningún tipo de error, a menos que sea un error de bloqueo .
Si el error está bloqueando , arroje la excepción. Una vez que se lanza la excepción, no hay necesidad de ocultarla porque es excepcional; informe al usuario al respecto (debe volver a formatear toda la excepción a algo útil para el usuario en la interfaz de usuario).
Su trabajo como desarrollador de software es tratar de evitar un caso excepcional en el que algún parámetro o situación de tiempo de ejecución pueda terminar en una excepción. Es decir, las excepciones no deben silenciarse, pero deben evitarse .
Por ejemplo, si sabe que alguna entrada entera podría tener un formato no válido, use en int.TryParse
lugar de int.Parse
. Hay muchos casos en los que puedes hacer esto en lugar de solo decir "si falla, simplemente lanza una excepción".
Lanzar excepciones es costoso.
Si, después de todo, se lanza una excepción, en lugar de escribir la excepción en el registro una vez que se ha lanzado, una de las mejores prácticas es detectarla en un controlador de excepciones de primera oportunidad . Por ejemplo:
- ASP.NET: Global.asax Application_Error
- Otros: evento AppDomain.FirstChanceException .
Mi postura es que los intentos / capturas locales son más adecuados para manejar casos especiales en los que puede traducir una excepción a otra, o cuando desea "silenciarla" por un caso muy, muy, muy, muy especial (un error de biblioteca arrojando una excepción no relacionada que necesita silenciar para solucionar todo el error).
Para el resto de los casos:
- Intenta evitar excepciones.
- Si esto no es posible: manejadores de excepciones de primera oportunidad.
- O use un aspecto PostSharp (AOP).
Respondiendo a @thewhiteambit por algún comentario ...
@thewhiteambit dijo:
Las excepciones no son errores fatales, ¡son excepciones! A veces ni siquiera son errores, pero considerarlos errores fatales es una comprensión completamente falsa de lo que son las excepciones.
En primer lugar, ¿cómo una excepción no puede ser ni siquiera un error?
- Sin conexión de base de datos => excepción.
- Formato de cadena no válido para analizar a algún tipo => excepción
- Intentando analizar JSON y aunque la entrada no es realmente JSON => excepción
- Argumento
null
mientras se esperaba el objeto => excepción
- Algunas bibliotecas tienen un error => produce una excepción inesperada
- Hay una conexión de socket y se desconecta. Luego intenta enviar un mensaje => excepción
- ...
Podríamos enumerar 1k casos de cuando se lanza una excepción, y después de todo, cualquiera de los casos posibles será un error .
Una excepción es un error, porque al final del día es un objeto que recopila información de diagnóstico: tiene un mensaje y ocurre cuando algo sale mal.
Nadie lanzaría una excepción cuando no hay un caso excepcional. Las excepciones deberían ser errores de bloqueo porque una vez que se lanzan, si no intenta caer en el uso try / catch y las excepciones para implementar el flujo de control , significan que su aplicación / servicio detendrá la operación que entró en un caso excepcional .
Además, sugiero a todos que verifiquen el paradigma de falla rápida publicado por Martin Fowler (y escrito por Jim Shore) . Así es como siempre entendí cómo manejar las excepciones, incluso antes de llegar a este documento hace algún tiempo.
[...] considérelos Fatal-Errores es una comprensión completamente falsa de cuáles son las excepciones.
Por lo general, las excepciones reducen el flujo de algunas operaciones y se manejan para convertirlas en errores comprensibles para los humanos. Por lo tanto, parece que una excepción en realidad es un mejor paradigma para manejar casos de error y trabajar en ellos para evitar un bloqueo completo de la aplicación / servicio y notificar al usuario / consumidor que algo salió mal.
Más respuestas sobre las preocupaciones de @thewhiteambit
Por ejemplo, en caso de que falte una conexión de base de datos, el programa podría continuar excepcionalmente escribiendo en un archivo local y enviando los cambios a la base de datos una vez que esté disponible nuevamente. Se podría intentar analizar nuevamente la conversión de cadena a número no válida con la interpretación local en el idioma en la excepción, como cuando intenta el idioma inglés predeterminado para que Parse ("1,5") falle y vuelva a intentarlo con la interpretación en alemán, que es completamente bien porque usamos coma en lugar de punto como separador. Verá que estas excepciones ni siquiera deben estar bloqueando, solo necesitan un poco de manejo de excepciones.
Si su aplicación puede funcionar sin conexión sin datos persistentes en la base de datos, no debe usar excepciones , ya que la implementación del flujo de control try/catch
se considera un antipatrón. El trabajo fuera de línea es un posible caso de uso, por lo que implementa el flujo de control para verificar si la base de datos es accesible o no, no espere hasta que sea inaccesible .
El análisis también es un caso esperado ( no un CASO EXCEPCIONAL ). Si espera esto, ¡no use excepciones para controlar el flujo! . ¡Obtiene algunos metadatos del usuario para saber cuál es su cultura y utiliza formateadores para esto! .NET también admite este y otros entornos, y una excepción porque se debe evitar el formateo de números si espera un uso específico de su aplicación / servicio .
Una excepción no controlada generalmente se convierte en un error, pero las excepciones en sí no son codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors
Este artículo es solo una opinión o un punto de vista del autor.
Dado que Wikipedia también puede ser solo la opinión del autor o los autores de la articulación, no diría que es el dogma , pero compruebe lo que dice el artículo de Codificación por excepción en algún párrafo:
[...] El uso de estas excepciones para manejar errores específicos que surgen para continuar con el programa se denomina codificación por excepción. Este antipatrón puede degradar rápidamente el software en rendimiento y mantenibilidad.
También dice en alguna parte:
Uso de excepción incorrecto
A menudo, la codificación por excepción puede provocar problemas adicionales en el software con el uso incorrecto de excepciones. Además de utilizar el manejo de excepciones para un problema único, el uso incorrecto de excepciones lo lleva más lejos al ejecutar código incluso después de que se genere la excepción. Este método de programación deficiente se parece al método goto en muchos lenguajes de software, pero solo ocurre después de que se detecta un problema en el software.
Honestamente, creo que el software no se puede desarrollar, no se tome en serio los casos de uso. Si sabes eso ...
- Su base de datos puede desconectarse ...
- Algunos archivos se pueden bloquear ...
- Es posible que algunos formatos no sean compatibles ...
- Alguna validación de dominio puede fallar ...
- Su aplicación debería funcionar en modo fuera de línea ...
- cualquiera que sea el caso de uso ...
... no usarás excepciones para eso . Se podría apoyar estos casos de uso que utilizan flujo de control regular.
Y si no se cubre algún caso de uso inesperado, su código fallará rápidamente, porque arrojará una excepción . Correcto, porque una excepción es un caso excepcional .
Por otro lado, y finalmente, a veces cubre casos excepcionales arrojando excepciones esperadas , pero no las arroja para implementar el flujo de control. Lo hace porque desea notificar a las capas superiores que no admite algún caso de uso o que su código no funciona con algunos argumentos o datos / propiedades del entorno.