Manejo de errores idiomáticos en Clojure


Cuando me pongo mi sombrero C, creo que tal vez el Clojure idiomático solo hace lo simple y comprueba los valores de retorno.

Cuando me pongo mi sombrero de Java (a regañadientes, debo agregar), pienso que como Clojure se ejecuta en la JVM, la forma natural debe ser usar excepciones de JVM.

Cuando me pongo mi sombrero funcional, estoy pensando que debe haber algún tipo de construcción monádica o macro de roscado que pueda manejar errores de una manera componible.

Entonces, ¿cuál es el idiomático ¿cómo manejar errores en un programa Clojure?

Author: Emil Eriksson, 2015-01-02

2 answers

El manejo de errores de Clojure generalmente está orientado a excepciones de JVM (sin marcar).

Slingshot hace que el uso de excepciones sea más agradable al permitir, por ejemplo, la desestructuración de los valores de excepción lanzados.

Para una alternativa que permita el manejo de errores al estilo erlang, debería mirar dire. Esta entrada de blog da una buena visión general de la racional para dire, así como una visión general de Clojure mecanismos de manejo de errores y desventajas.

 16
Author: Symfrog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-02 15:09:35

Para un enfoque muy funcional, eche un vistazo a cats, lo que correspondería a "algún tipo de construcción monádica":

Teoría de categorías y abstracciones algebraicas para Clojure y ClojureScript. http://funcool.github.io/cats/latest /

Ejemplo tomado de su documentación :

(require '[cats.core :as m])
(require '[cats.monad.maybe :as maybe])

(m/mappend (maybe/just [1 2 3])
           (maybe/nothing)
           (maybe/just [4 5 6])
           (maybe/nothing))

Puedes ver que nothing es algo equivalente a nil, excepto que no tienes que comprobar nada manualmente.

 4
Author: nha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-14 07:41:05