2011-10-31 13 views
10

Después de usar el tipo F # option por un tiempo, me doy cuenta de que podría utilizarse para casos excepcionales. Puedo utilizar cualquiera option o Exception en los siguientes ejemplos:Opción vs Excepción en el manejo de excepciones

  1. Los find funciones de la Lista/Seq módulos de matriz/plantean KeyNotFoundException en casos poco comunes, mientras correspondientes homólogos tryFind vuelven None en esas situaciones.
  2. Cuando hago backtracking (en la solución de N-queens, Sudoku, etc.), cuando una rama no tiene solución, puedo levantar una excepción y atraparla más tarde o devolver None para que coincida con ese valor para dar marcha atrás. Esos casos ocurren bastante a menudo hasta que encontremos una solución.

Mi impresión es option es un enfoque más funcional, mientras que Exception es más comúnmente usado en la plataforma .NET.

¿Cuáles son las diferencias entre option y Exception en el manejo de excepciones en términos de usabilidad, rendimiento, etc.? ¿En qué casos usar una técnica es mejor que usar la otra?

Respuesta

15

El CLR hace que la operación de lanzar y atrapar una excepción sea extremadamente costosa. Solo por esta razón, debería preferir construcciones como Opción para informar las fallas esperadas. Si la falla es realmente excepcional y casi irrecuperable, adelante y haga una excepción. Pero como usted nota, cosas como el rastreo retroactivo durante una búsqueda no son excepcionales, y verá que su rendimiento sufre mucho si las implementa con excepciones.

Como esto es una propiedad de la CLR, realmente no importa si usted está en F # o no. Según tengo entendido, otros tiempos de ejecución para los lenguajes similares a ML, p. Ej. ocaml, no tiene esta característica, por lo que puede usar excepciones más a menudo para el flujo de control.

+0

De hecho, una vez lo medí y descubrí que las excepciones de C++ son 6 veces más lentas que OCaml y las .NET son 600 veces más lentas que OCaml. –

5

Desde el punto de vista teórico. option es algo que deberías usar en aquellas funciones que son puras desde el punto de vista de la PF (puedes buscar en Google cuáles son las funciones puras). Las excepciones son más sobre el mundo impuro (Como el mundo IO en Haskell).

Ahora, desde el punto de vista práctico, sugiero usar option como tipo de retorno cuando la lógica de su aplicación dice que el valor puede estar allí o no, es decir, que el valor no está presente es una regla de aplicación válida. Las excepciones son algo que debe plantearse cuando ocurre algo en la lógica de la aplicación que indica la ejecución incorrecta de la lógica o algún estado de aplicación incorrecto que no se esperaba como lo hace la aplicación.

Desde el rendimiento La excepción de lanzamiento de POV es más costosa (debido al desenrollado de la pila, al buscar el controlador de excepciones apropiado, etc.) en comparación con los tipos de opciones que regresan.

+0

No estoy de acuerdo con el comentario sobre el rendimiento. Los tipos de opciones son más livianos que los tipos de Excepción (vea la respuesta de @Sebastian Good). – pad

+0

Mi texto dice 'excepción que será malo' ... eso significa que las excepciones no son buenas en el rendimiento – Ankur

+0

Lo siento, mi error por no leer con cuidado :) – pad

4

En términos de usabilidad, prefiero las opciones en F #.

  • Las opciones encapsulan el estado excepcional así como el estado esperado. Esto le permite deffer manejo del estado excepcional hasta que necesite el estado esperado.
  • Opción también tiene un número de helper functions que tendrá que escribir usted mismo con excepciones.
  • Partial Active Patterns le permiten manejar múltiples casos excepcionales muy limpiamente con opciones.
  • Optional Paramaters en F # se implementan con Opciones. Esta naturaleza diferida que mencioné anteriormente le permite no importar qué generó el caso excepcional, siempre y cuando el consumidor tenga un valor predeterminado para él.

Las opciones son una manera fundamentalmente diferente de pensar en casos excepcionales y creo que ayudan a que F # sea especial.

+0

+1 para una respuesta muy bien pensada. Eso es lo que quiero saber sobre el uso de la opción en el manejo de excepciones. – pad

8

Mi pregunta es cuáles son las diferencias entre la opción y la excepción en el manejo de excepciones en términos de usabilidad, rendimiento ...?

El tipo option ofrece una comprobación estática más fuerte que las excepciones, lo que aumenta las posibilidades de que el compilador capture el error del programador. La devolución no excepcional es probable que sea más rápida que devolver el resultado Some, pero la devolución excepcional es cientos de veces más lenta que la devolución None.

¿En qué casos el uso de una técnica es mejor que el otro?

Cada vez que estoy escribiendo código como servidores y demonios que necesita para seguir funcionando cojo el mayor número posible de excepciones y reemplazarlos con los valores de tipos de unión como option. El sistema de tipo estático me obliga a manejar retornos excepcionales y no excepcionales en casi todos los casos, lo que hace que sea mucho más fácil escribir código que no muera debido a una excepción que se propaga inesperadamente.