En mi opinión, las excepciones son una herramienta esencial para detectar errores de código en 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 la pila, pueda descubrir qué sucedió en un registro.
Las excepciones son principalmente una herramienta de desarrollo y una forma de obtener informes de error razonables de la producción en casos inesperados.
Aparte de la separación de las preocupaciones (el camino feliz con solo los errores esperados frente a la falla hasta llegar a un controlador genérico para errores inesperados) es algo bueno, hacer que su código sea más legible y mantenible, de hecho es imposible preparar su código para todo lo posible casos inesperados, incluso al hincharlo con código de manejo de errores para completar la ilegibilidad.
Ese es en realidad 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 comprobadas en Java no funcionaron: la decisión se toma al momento de desarrollar una API, cuando no está del todo claro qué se espera o qué inesperado.
Ejemplo simple: la API de un mapa hash puede tener dos métodos:
Value get(Key)
y
Option<Value> getOption(key)
el primero arroja 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 esperar que haya un valor para una clave determinada, por lo que si no hay uno, es un error que este código no puede solucionar porque La suposición ha fallado. En este caso, en realidad es el comportamiento deseado salir de la ruta del código y pasar a un controlador genérico en caso de que falle la llamada.
El código nunca debe tratar con supuestos básicos fallidos.
Excepto al marcarlos y lanzar excepciones bien legibles, por supuesto.
Lanzar excepciones no es malo, pero atraparlas puede serlo. No intentes arreglar errores inesperados. Capture excepciones en algunos lugares donde desea continuar algún ciclo u operación, regístrelos, tal vez 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 sea fácil expresar su intención, es decir, declarar si espera un caso determinado, como 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 cual las personas resienten 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 preocupaciones de los nuevos idiomas son malas experiencias.
Eso y algunos malentendidos sobre para qué son realmente buenos.
Simularlos haciendo TODO a través del enlace monádico hace que su código sea menos legible y fácil de mantener, y termina sin un seguimiento de la pila, lo que empeora este enfoque.
El manejo de errores de estilo funcional es ideal para casos de error esperados.
Deje que el manejo de excepciones se encargue automáticamente de todo lo demás, para eso está :)
panic
cuál no es exactamente lo mismo. Además de lo que se dice allí, una excepción no es mucho más que una forma sofisticada (pero cómoda) de realizar unaGOTO
, aunque nadie lo llama así, por razones obvias.