Uso de Excepciones en C#


Foto de Kenny Eliason en Unsplash


Sin excepción "ninguna": en todo el código fuente con el que he trabajado, se han usado excepciones para controlar el flujo de la aplicación.

No me refiero a las librerías open source desarrolladas por megaexpertos, sino al código real con el que me topo en mi día a día. El que picamos el resto de mortales.

Es uno de los errores más comunes que veo y, lo peor, no es fácil convencer a alguien que lleva años haciéndolo de otra manera.
 

Más abajo doy algunos consejos prácticos basados en mi experiencia pero antes que hablen los expertos:

Recursos interesantes para comprender mejor las excepcioneS


Cómo piensA MARK SEEMANN sobre los errores en la programación:

Error categories and category errors - MARK SEEMANN

Conclusión del artículo:

Este artículo te ofrece un marco para pensar en los errores de software. Hay errores que puedes prever y decides corregir; errores que puedes prever pero eliges ignorar; y errores que aún no han sido previstos: los bugs.

Reflexionar un poco de antemano suele ayudarte a anticipar algunos errores, pero eso no significa que debas intentar preverlos todos. Algunos errores son simplemente errores de programación que cometemos porque somos humanos; no siempre podemos anticipar cómo se comportará un estado particular del código. Sin embargo, una vez que descubres un error, tienes dos opciones: ¿lo corriges o lo ignoras?

Hay situaciones en las que puedes decidir, de forma consciente, ignorar ciertos errores. Eso no significa que seas un programador irresponsable, sino que puede ser el resultado de un análisis deliberado. Por ejemplo, cualquier operación de red puede fallar. ¿Qué tan crítico es que tu aplicación siga funcionando sin conexión? ¿Vale la pena hacer el código lo suficientemente robusto para manejarlo? ¿O podrías convivir con unas pocas horas de inactividad al trimestre? En este último caso, quizá sea mejor dejar que un humano se ocupe del problema cuando ocurra.

Las tres categorías de error que propongo dependen del contexto. Tú decides qué problemas abordar y cuáles ignorar. Pero, más allá de eso, el manejo de errores no tiene por qué ser complicado.


Qué es una situación exepcional en el código:

What is an exceptional situation in code? - Vladimir Khorikov

Estas son sus conclusiones:

Las situaciones excepcionales son fallos de los que un programa no puede recuperarse. Son las siguientes:

  • Rutas o estados de código ilegales cuya presencia significa que introdujiste un error en tu software.
  • Violación de contrato: violación de un invariante, precondición o postcondición.
  • Suposiciones fallidas: suposiciones que haces sobre servicios externos que resultan ser falsas.
  • Fallos irrecuperables de software y hardware.

Las situaciones no excepcionales son fallos de los que puedes recuperarte programáticamente o incluso esperas que ocurran. Son:

  • Fallos en la validación de entradas.
  • Fallos transitorios o recuperables de software y hardware.

No utilizar excepciones para control de flujo:

Exceptions for flow control in C# - Vladimir Khorikov

Estas son sus conclusiones:

  • Lanza una excepción para indicar una situación inesperada en tu software.
  • Usa valores de retorno para la validación de entradas.
  • Si sabes cómo manejar las excepciones que lanza una biblioteca, captúralas en el nivel más bajo posible.
  • Si tienes una excepción inesperada, descarta la operación actual por completo. No finjas saber cómo manejarlas.

Cómo evitar que los casos de errores específicos de la aplicación infecten tus modelos de dominio:

Decoupling application errors from domain models - MARK SEEMANN

Conclusión:

Los errores pueden ocurrir en diversos lugares tu código base: al validar la entrada, al tomar decisiones comerciales, al escribir en bases de datos o leerlas, etc.

Utiliza las clases tipo Either o Result para manejar el flujo de esos errores si forman parte de tu Dominio.


Con estos 4 artículos ya tendrás mucho ganado. Por si no tienes suficiente aquí dejo otros para complementar:


Cómo manejar excepciones correctamente (Mi experiencia)

1. Primero entender el concepto.

Para aclarar la idea, puede ayudarte pensar en ellas como "Excepciones no controladas" en lugar de simplemente "Excepciones".

Una excepción no controlada es, por definición, algo que no debería ocurrir o una situación que no habías previsto. Y como no la habías considerado, la única opción que te queda es finalizar el proceso en ejecución.
 

2. No uses try - catch a diestro y siniestro.

Evita rodear el código con try-catch por todas partes. En su lugar, maneja las excepciones de manera centralizada:

  • Al inicio de la ejecución del proceso.
  • En el nivel más bajo, cuando tu código interactúa con un servicio externo y el flujo sale de tu Thread.
  • Siempre de forma estructurada y no dispersa en el código.
     

3. Si un error es previsible, usa Result o Either.

Cuando sabes que un error puede ocurrir, no uses excepciones para manejarlo. En su lugar, utiliza estructuras como Result o Either, que permiten devolver un resultado correcto o una descripción del problema detectado, evitando el uso innecesario de excepciones.


¡Gracias por leer! :)




Quizá algun día empiece a enviar una newsletter, si te gustaría recibirla subscríbete aquí

Archivo