He estado reflexionando sobre este problema durante un tiempo y me encuentro continuamente encontrando advertencias y contradicciones, así que espero que alguien pueda sacar una conclusión de lo siguiente:
Favorecer excepciones sobre códigos de error
Hasta donde sé, después de trabajar en la industria durante cuatro años, leer libros y blogs, etc., la mejor práctica actual para manejar errores es lanzar excepciones, en lugar de devolver códigos de error (no necesariamente un código de error, sino un tipo que representa un error).
Pero, para mí, esto parece contradecir ...
Codificación para 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 buscar atrapar? La implementación podría arrojar 10 excepciones diferentes, o podría arrojar ninguna. Cuando detectamos una excepción, ¿estamos haciendo suposiciones sobre la implementación?
A menos que la interfaz tenga ...
Especificaciones de excepción
Algunos lenguajes permiten a los desarrolladores afirmar que ciertos métodos arrojan ciertas excepciones (Java, por ejemplo, usa la throws
palabra clave). Desde el punto de vista del código de llamada, esto parece estar bien: sabemos explícitamente qué excepciones podríamos necesitar detectar.
Pero, esto parece sugerir un ...
Abstracción permeable
¿Por qué una interfaz debe especificar qué excepciones se pueden lanzar? ¿Qué sucede si la implementación no necesita lanzar una excepción, o 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 actual de la técnica (o que pronto será) para el manejo de errores que cumpla con los requisitos de las mejores prácticas descritas anteriormente, pero que no se base en que el código de llamada verifique el valor de retorno de los códigos de error?