En mi opinión, las excepciones son una herramienta esencial para detectar errores de código en el tiempo de ejecución. Tanto en pruebas como en producción. Haga que sus mensajes sean lo suficientemente detallados para que, en combinación con un seguimiento de pila, pueda averiguar qué sucedió en un registro.
Las excepciones son principalmente una herramienta de desarrollo y una forma de obtener informes de errores razonables de producción en casos inesperados.
Aparte de la separación de inquietudes (la ruta feliz con solo los errores esperados y la caída hasta llegar a algún controlador genérico para errores inesperados) es algo bueno, que hace que su código sea más legible y mantenible, de hecho, es imposible preparar su código. para todos los posibles casos inesperados, incluso hinchándolo con el código de manejo de errores para completar la ilegibilidad.
Ese es realmente el significado de "inesperado".
Por cierto, lo que se espera y lo que no es una decisión que solo se puede tomar en el sitio de la llamada. Es por eso que las excepciones verificadas en Java no funcionaron: la decisión se toma al momento de desarrollar una API, cuando no está claro en absoluto qué se espera o no se espera.
Ejemplo simple: la API de un mapa hash puede tener dos métodos:
Value get(Key)
y
Option<Value> getOption(key)
el primero lanza una excepción si no se encuentra, el último le da un valor opcional. En algunos casos, este último tiene más sentido, pero en otros, su código debe tener en cuenta que debe haber un valor para una clave determinada, por lo que si no hay uno, es un error que este código no puede corregir porque es un error básico. La suposición ha fallado. En este caso, en realidad es el comportamiento deseado el que se salga de la ruta del código y caiga hacia algún controlador genérico en caso de que la llamada falle.
El código nunca debe tratar de lidiar con suposiciones básicas fallidas.
Excepto al verificarlos y lanzar excepciones legibles, por supuesto.
Lanzar excepciones no es malo, pero atraparlas puede ser. No intentes arreglar errores inesperados. Detecte excepciones en algunos lugares donde desea continuar con algún ciclo u operación, regístrelas, quizás informe un error desconocido, y eso es todo.
Los bloques de captura en todo el lugar son una muy mala idea.
Diseñe sus API de manera que le sea fácil expresar su intención, es decir, declarar si espera un caso determinado, como la clave no encontrada o no. Los usuarios de su API pueden elegir la llamada de lanzamiento solo para casos realmente inesperados.
Supongo que la razón por la que las personas rechazan las excepciones y van demasiado lejos al omitir esta herramienta crucial para la automatización del manejo de errores y una mejor separación de las inquietudes de los nuevos idiomas son malas experiencias.
Eso, y algunos malentendidos acerca de para qué sirven realmente.
Simularlos haciendo TODO a través de un enlace monádico hace que tu código sea menos legible y mantenible, y terminas sin un seguimiento de pila, lo que hace que este enfoque sea peor.
El manejo de errores de estilo funcional es excelente para los casos de error esperados.
Deje que el manejo de excepciones se encargue automáticamente de todo lo demás, para eso está :)