2015-01-02 16 views
24

Wenn ich meinen C-Hut anziehe, denke ich, dass vielleicht idiomatische Clojure einfach das Einfache tut und die Rückgabewerte überprüft.Idiomatische Fehlerbehandlung in Clojure

Wenn ich meinen Java-Hut (widerwillig, ich muss hinzufügen), denke ich mir, dass, da Clojure auf der JVM läuft der natürliche Weg sein muss, JVM-Ausnahmen zu verwenden.

Wenn ich meinen funktionellen Hut aufsetze, denke ich, dass es eine Art monadische Konstruktion oder Threading-Makro geben muss, die Fehler in einer zusammensetzbaren Weise behandeln kann.

Was ist der idiomatische Weg, um Fehler in einem Clojure-Programm zu behandeln?

+1

Man fühlt fast, dass die eine Monade im Kern Clojure gehört. Eine Ausnahme zu werfen, die ich für typisch halte, fühlt sich wie ein Rückfall in die imperative Vorgehensweise an. – Mario

Antwort

15

Clojure Fehlerbehandlung ist in der Regel JVM-Ausnahme (nicht geprüft) orientiert.

Slingshot macht die Verwendung von Ausnahmen angenehmer, indem sie beispielsweise das Löschen von ausgelösten Ausnahmewerten zulässt.

Für eine Alternative, die Erlang-style Fehlerbehandlung ermöglicht, sollten Sie sich dire ansehen. Diese blog post gibt einen guten Überblick über die rationale für den Notfall sowie einen Überblick über Clojure Fehlerbehandlung Mechanismen und Nachteile.

4

Für einen sehr funktionalen Ansatz, einen Blick auf cats, die auf „eine Art von monadischen Konstruktion“ entsprechen würde:

Kategorie Theorie und Algebraische Abstraktionen für Clojure und ClojureScript. http://funcool.github.io/cats/latest/

Beispiel aus ihrer Dokumentation entnommen:

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

Sie können sehen, dass nothing-nil etwas äquivalent ist, außer dass Sie etwas nicht manuell überprüfen müssen.

+0

Als Haskeller favorisiere ich den 'Maybe'-Ansatz der Monade, aber ich denke nicht, dass es Clojure ist. – MasterMastic

+0

Ich habe nur mit Katzen gespielt, aber ich weiß, dass einige Leute es in der Produktion benutzen. Es gibt auch https://github.com/uncomplicate/fluokitten/ und vielleicht sogar https://github.com/bwo/monads, aber es gibt viele Fehlerbehandlungs-Bibliotheken da draußen (zum Beispiel dreas und slingshot), also fühlt es sich definitiv an wie etwas, das in der Kernsprache verbessert werden könnte. – nha