He estado reflexionando sobre este problema durante un tiempo y me encuentro continuamente encontrando advertencias y contradicciones, por lo que espero que alguien pueda llegar a una conclusión sobre lo siguiente:
Favorecer excepciones sobre códigos de error
Por lo que yo sé, desde que trabajé en la industria durante cuatro años, leyendo libros y blogs, etc., la mejor práctica actual para el manejo de errores es lanzar excepciones, en lugar de devolver códigos de error (no necesariamente un código de error). , pero un tipo que representa un error).
Pero, para mí, esto parece contradecir ...
Codificación a interfaces, no implementaciones
Codificamos interfaces o abstracciones para reducir el acoplamiento. No sabemos, o queremos saber, el tipo específico y la implementación de una interfaz. Entonces, ¿cómo podemos saber qué excepciones deberíamos estar tratando de atrapar? La implementación podría lanzar 10 excepciones diferentes, o podría no lanzar ninguna. Cuando detectamos una excepción, seguramente estamos haciendo suposiciones acerca de la implementación.
A menos que la interfaz tenga ...
Especificaciones de excepción
Algunos lenguajes permiten a los desarrolladores afirmar que ciertos métodos producen ciertas excepciones (Java, por ejemplo, usa la palabra clave throws
). Desde el punto de vista del código de llamada, esto parece correcto: sabemos explícitamente qué excepciones deberíamos detectar.
Pero - esto parece sugerir un ...
Abstracción con fugas
¿Por qué debería una interfaz especificar qué excepciones se pueden lanzar? ¿Qué sucede si la implementación no necesita lanzar una excepción o si necesita lanzar otras excepciones? No hay forma, a nivel de interfaz, de saber qué excepciones puede querer lanzar una implementación.
Entonces ...
Para concluir
¿Por qué se prefieren las excepciones cuando parecen (en mi opinión) contradecir las mejores prácticas de software? Y, si los códigos de error son tan malos (y no necesito que me vendan los vicios de los códigos de error), ¿hay otra alternativa? ¿Cuál es el estado de la técnica actual (o pronto lo estará) para el manejo de errores que cumpla con los requisitos de las mejores prácticas como se describe anteriormente, pero no se basa en que el código de llamada verifique el valor de retorno de los códigos de error?