web-dev-qa-db-ja.com

Clojureでの慣用的なエラー処理

Cの帽子をかぶると、慣用的なClojureが単純なことをして、戻り値をチェックするだけだと思います。

Java帽子をかぶったとき(しぶしぶ追加する必要があります)、ClojureはJVMで実行されるため、JVM例外を使用するのが自然な方法である必要があると思います。

機能的な帽子をかぶったとき、エラーを構成可能な方法で処理できる、ある種のモナド構造またはスレッドマクロが必要だと思います。

では、Clojureプログラムでエラーを処理する慣用的な方法は何ですか?

30
Emil Eriksson

Clojureのエラー処理は、通常、JVM例外(チェックなし)指向です。

Slingshot たとえば、スローされた例外値の破棄を許可することで、例外の使用をより快適にします。

Erlangスタイルのエラー処理を可能にする代替手段については、 dire を参照してください。この ブログ投稿 は、悲惨な理由の概要と、Clojureのエラー処理メカニズムと欠点の概要を示しています。

18
Symfrog

非常に機能的なアプローチについては、 cats を見てください。これは、「ある種のモナド構造」に対応します。

ClojureとClojureScriptの圏論と代数的抽象化。 http://funcool.github.io/cats/latest/

彼らのドキュメントからの例:

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

nothingnilとある程度同等であることがわかりますが、手動で何もチェックする必要がない点が異なります。

4
nha

Clojureでのエラー処理の公式な手段は、JVMに付属しているため、例外です。ただし、関数は例外をスローするときに参照透過性がなく、このプロパティも構成できません。例外は機能しません。

多くの人がClojureでさまざまなスタイルの代替/モナドエラー処理を試しました。私はこの目的のためにプロムナードを作成しました https://github.com/kumarshantanu/promenade そしてそれを使用した良い経験があります。

0
Shantanu Kumar