Clojure中的惯用语错误处理

时间:2015-01-02 12:56:39

标签: exception error-handling clojure maybe either

当我戴上我的C帽时,我认为也许惯用的Clojure只做简单的事情并检查返回值。

当我戴上我的Java帽子时(不情愿地,我必须添加),我认为自从Clojure在JVM上运行后,自然必须使用JVM异常。

当我戴上功能性帽子时,我认为必须有某种monadic构造或线程宏可以以可组合的方式处理错误。

那么在Clojure程序中处理错误的惯用方法是什么?

3 个答案:

答案 0 :(得分:18)

Clojure错误处理通常是面向JVM异常(未经检查)的。

Slingshot允许例如对抛出的异常值进行解构,从而使异常更令人愉快。

对于允许erlang风格错误处理的替代方法,您应该查看dire。这个blog post很好地概述了可怕的理性以及Clojure错误处理机制和缺点的概述。

答案 1 :(得分:4)

对于一个非常实用的方法,请看cats,这对应于"某种monadic结构" :

  

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

您可以看到nothing有点等同于nil,除非您不必手动检查任何内容。

答案 2 :(得分:0)

Clojure中用于错误处理的官方方法是异常,因为它是JVM附带的。但是,当函数抛出异常时,它们也不是参照透明的,并且此属性也不是可组合的。异常不起作用。

许多人在Clojure中尝试了不同样式的替代/单峰错误处理。我为此目的创建了https://github.com/kumarshantanu/promenade长廊,并在使用它方面有丰富的经验。