Clojure:
Manejo de errores

Cómo hacerlo:

Clojure, al igual que sus ancestros Lisp, se basa en las excepciones para tratar los errores. Aquí te mostramos cómo demostrar de qué estás hecho cuando las cosas se ponen difíciles.

Lanzar una excepción es sencillo:

(throw (Exception. "¡Ups! Algo salió mal."))

Capturar una excepción, estarás haciendo esto mucho:

(try
  ;; código riesgoso
  (/ 1 0)
  (catch ArithmeticException e
    (println "¡No se puede dividir por cero!"))
  ;; el bloque finally se ejecuta pase lo que pase
  (finally 
    (println "El código de limpieza va aquí.")))

Salida de muestra para el bloque catch de arriba:

¡No se puede dividir por cero!
El código de limpieza va aquí.

Usando ex-info y ex-data para un contexto más rico sobre las excepciones:

(try
  ;; provocando una excepción personalizada
  (throw (ex-info "Error personalizado" {:type :fallo-personalizado}))
  (catch Exception e
    ;; obteniendo los datos de nuestra excepción personalizada
    (println (ex-data e))))

Salida de muestra:

{:type :fallo-personalizado}

Inmersión Profunda

La historia del manejo de errores en Clojure no es radicalmente diferente de otros Lisps o incluso de Java (de donde hereda el mecanismo try-catch). Es pragmático; usar excepciones es el camino principal, al igual que Java, pero Clojure ofrece un sabor funcional con ex-info y ex-data para datos de error más enriquecidos.

Las alternativas para el manejo de errores en Clojure incluyen el uso de construcciones monádicas, como la monada either de bibliotecas como cats, o core.async para la propagación de errores basada en canales. Sin embargo, estas son más complejas y utilizadas en escenarios específicos.

Históricamente, el manejo de errores en los lenguajes de programación ha evolucionado desde simples retornos de estado hasta los mecanismos de manejo de excepciones más sofisticados de los lenguajes modernos. Clojure opta por la simplicidad y un toque de programación funcional, fusionando lo antiguo con lo nuevo.

Ver También