当我戴上我的C帽时,我认为也许惯用的Clojure只做简单的事情并检查返回值。
当我戴上我的Java帽子时(不情愿地,我必须添加),我认为自从Clojure在JVM上运行后,自然必须使用JVM异常。
当我戴上功能性帽子时,我认为必须有某种monadic构造或线程宏可以以可组合的方式处理错误。
那么在Clojure程序中处理错误的惯用方法是什么?
答案 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长廊,并在使用它方面有丰富的经验。