2011-01-12 15 views
17

El manejo de errores heredados tiende a seguir el método de que todas las funciones devuelven un código en función de éxito/falla. Verificará este código y manejará (si hay un error) de manera apropiada.¿Por qué es mejor lanzar una excepción en lugar de devolver un código de error?

Los lenguajes de programación modernos, sin embargo, siguen el modelo de excepción, donde si ocurre algo excepcional que no se puede manejar adecuadamente se produce una excepción, que sigue burbujeando hasta que se maneja.

Mi pregunta es ¿por qué nos hemos movido hacia el modelo de excepción? ¿Cuáles son las razones detrás de esto? ¿Por qué es mejor?

Explicaciones/enlaces serían muy apreciados.

Respuesta

20

He escrito sobre esto en detalle: Exceptions vs. status returns, pero brevemente:

  1. excepciones sale de su código limpio de todos los controles necesarios al probar los rendimientos de estado en cada llamada,
  2. excepciones que permiten utilice el valor de retorno de las funciones para los valores reales,
  3. Las excepciones pueden contener más información que una lata de devolución de estado,
  4. Lo más importante: las excepciones no se pueden ignorar mediante la inacción, mientras el estado vuelve puede.

Para ampliar el último punto: si olvida hacer lo que debería hacer con el estado devuelve, ignora los errores. Si olvida hacer lo que debería hacer con las excepciones, la excepción salta a la capa externa del software donde se vuelve visible.

+1

no dejaste tu lista el hecho de que usar excepciones permite try/catch (MyCustomException ex) para que tú/(otros desarrolladores) puedan agregar try/catch que solo captará el nuevo tipo de excepción que has creado. –

+0

Ese es un punto excelente. Me gusta que las capas puedan ignorar excepciones y dejarlas pasar. Su punto es que puede ser muy detallado para el tipo de excepción individual (suponiendo que esté utilizando un lenguaje que admita excepciones por su tipo). –

9

Aquí hay un par de razones

  • Ignorar una excepción requiere acción por parte del desarrollador, ignorando un mal valor de regresar requiere exactamente 0 acción. Esto, en teoría, hace que sea más probable que un desarrollador maneje un error al ignorarlo o incluso sin darse cuenta de que estaba sucediendo.
  • Proporciona una separación más limpia entre el punto de un error y el manejo. No fuerza la propagación manual del error en todos los puntos intermedios.
  • Las excepciones pueden ser una carga de información más grande y más rica que un simple código de error. Hay formas de hacer esto con los códigos de error, pero es más una ocurrencia tardía y es un poco engorroso.
2

Los códigos de estado suelen ser mejores que las excepciones en los casos en que representan casos que el código de llamada inmediata de una función está preparado para manejar. El problema con los códigos de estado es que si el código de llamada inmediata no los maneja, es probable que nada lo haga. Si el código arroja una excepción y el código de llamada inmediata no está preparado para manejarlo, la excepción se propagará al código que, al menos, afirma estar preparado.

Cuestiones relacionadas