Si un lenguaje admite inherentemente excepciones, entonces se prefiere lanzar excepciones y los clientes pueden detectar la excepción si no quieren que resulte en una falla. De hecho, los clientes de su código esperan excepciones y se encontrarán con muchos errores porque no verificarán los valores de retorno.
Hay bastantes ventajas al usar excepciones si tiene una opción.
Mensajes
Las excepciones contienen mensajes de error legibles por el usuario que los desarrolladores pueden usar para depurar o incluso mostrar a los usuarios si así lo desean. Si el código consumidor no puede manejar la excepción, siempre puede registrarlo para que los desarrolladores puedan revisar los registros sin tener que detenerse en cualquier otro rastro para descubrir cuál era el valor de retorno y mapearlo en una tabla para descubrir cuál era excepción real
Con los valores de retorno, no hay información adicional que pueda proporcionarse fácilmente. Algunos idiomas admitirán la realización de llamadas a métodos para obtener el último mensaje de error, por lo que esta preocupación se disipa un poco, pero eso requiere que la persona que llama realice llamadas adicionales y, a veces, requerirá acceso a un 'objeto especial' que lleve esta información.
En el caso de mensajes de excepción, proporciono la mayor cantidad de contexto posible, como:
No se pudo recuperar una política de nombre "foo" para la "barra" del usuario, a la que se hizo referencia en el perfil del usuario.
Compare esto con un código de retorno -85. ¿Cuál preferirías?
Pilas de llamadas
Las excepciones generalmente también tienen pilas de llamadas detalladas que ayudan a depurar el código más rápido y más rápido, y también pueden registrarse mediante el código de llamada si así lo desea. Esto permite a los desarrolladores identificar el problema generalmente en la línea exacta y, por lo tanto, es muy poderoso. Una vez más, compare esto con un archivo de registro con valores de retorno (como -85, 101, 0, etc.), ¿cuál preferiría?
Enfoque fallido sesgado rápido
Si se llama a un método en algún lugar que falla, arrojará una excepción. El código de llamada tiene que suprimir la excepción explícitamente o fallará. He descubierto que esto es realmente sorprendente porque durante el desarrollo y las pruebas (e incluso en la producción) el código falla rápidamente, lo que obliga a los desarrolladores a solucionarlo. En el caso de los valores de retorno, si se omite la comprobación de un valor de retorno, el error se ignora silenciosamente y el error aparece en algún lugar inesperado, generalmente con un costo mucho mayor para depurar y corregir.
Envolviendo y desenvolviendo excepciones
Las excepciones pueden envolverse dentro de otras excepciones y luego desenvolverse si es necesario. Por ejemplo, su código podría arrojar el ArgumentNullException
cual el código de llamada podría envolverse dentro de una UnableToRetrievePolicyException
porque esa operación había fallado en el código de llamada. Si bien es posible que se muestre al usuario un mensaje similar al ejemplo que proporcioné anteriormente, algunos códigos de diagnóstico pueden desenvolver la excepción y descubrir que se ArgumentNullException
ha producido el problema, lo que significa que es un error de codificación en el código de su consumidor. Esto podría activar una alerta para que el desarrollador pueda arreglar el código. Tales escenarios avanzados no son fáciles de implementar con los valores de retorno.
Simplicidad de código
Este es un poco más difícil de explicar, pero aprendí a través de esta codificación tanto con valores de retorno como con excepciones. El código que se escribió utilizando valores de retorno generalmente haría una llamada y luego verificaría cuál era el valor de retorno. En algunos casos, llamaría a otro método y ahora tendrá otra serie de comprobaciones para los valores de retorno de ese método. Con excepciones, el manejo de excepciones es mucho más simple en la mayoría, si no en todos los casos. Tiene un bloque try / catch / finally, con el tiempo de ejecución haciendo todo lo posible para ejecutar el código en los bloques finalmente para la limpieza. Incluso los bloques anidados try / catch / finally son relativamente más fáciles de seguir y mantener que los valores anidados if / else y los valores de retorno asociados de múltiples métodos.
Conclusión
Si la plataforma que está utilizando admite excepciones (especialmente, como Java o .NET), entonces definitivamente debe suponer que no hay otra forma, excepto lanzar excepciones porque estas plataformas tienen pautas para lanzar excepciones, y sus clientes esperan entonces. Si estuviera usando su biblioteca, no me molestaría en verificar los valores de retorno porque espero que se produzcan excepciones, así es el mundo en estas plataformas.
Sin embargo, si fuera C ++, sería un poco más difícil determinarlo porque ya existe una gran base de código con códigos de retorno, y una gran cantidad de desarrolladores están sintonizados para devolver valores en lugar de excepciones (por ejemplo, Windows está plagado de HRESULT) . Además, en muchas aplicaciones, también puede ser un problema de rendimiento (o al menos percibido).
try
/catch
existe para. Además, puede colocar sutry
/catch
mucho más arriba en la pila en una ubicación más adecuada para manejarlo (lo que permite una mayor separación de las preocupaciones).