2015-01-02 18 views
24

Quando indosso il mio cappello C, penso che forse Clojure idiomatico faccia la cosa semplice e controlli i valori di ritorno.Gestione degli errori idiomatici in Clojure

Quando ho messo il mio cappello Java (a malincuore, devo aggiungere), penso che dal momento che Clojure gira su JVM il modo naturale deve essere usare le eccezioni JVM.

Quando indosso il mio cappello funzionale, sto pensando che ci deve essere una sorta di costruzione monadica o macro di threading in grado di gestire gli errori in modo componibile.

Quindi qual è il modo idiomatico di gestire gli errori in un programma Clojure?

+1

Si sente quasi che l'oither monade appartiene al core Clojure. Semplicemente lanciando un'eccezione, che ritengo sia tipica, si sente come un ritorno al modo imperativo di fare le cose. – Mario

risposta

15

La gestione degli errori Clojure è generalmente l'eccezione JVM (non selezionata).

Slingshot rende più piacevole l'utilizzo delle eccezioni consentendo, ad esempio, la destrutturazione su valori di eccezioni generate.

Per un'alternativa che consente la gestione degli errori in stile erlang, è necessario consultare dire. Questo blog post offre una buona panoramica del razionale per dire e una panoramica dei meccanismi di gestione degli errori Clojure e degli inconvenienti.

4

Per un approccio molto funzionale, uno sguardo ai cats, che corrisponderebbe a "una sorta di costruzione monade": teoria delle categorie

e astrazioni algebriche per Clojure e ClojureScript. http://funcool.github.io/cats/latest/

Esempio tratto dal loro documentazione:

(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)) 

Si può vedere che è un po 'nothing equivalente a nil, tranne che non controlla nulla manualmente.

+0

Come Haskeller, preferisco l'approccio monade "forse" di faaaar, ma non penso che sia un Clojure idiomatico. – MasterMastic

+0

Ho suonato solo nel repl con i gatti ma so che alcune persone lo usano in produzione. C'è anche https://github.com/uncomplicate/fluokitten/ e forse anche https://github.com/bwo/monads ma ci sono molte librerie di gestione degli errori là fuori (per esempio dire e fionda) quindi questo sicuramente si sente come qualcosa che potrebbe essere migliorato nel linguaggio principale. – nha