35

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

当我戴上我的 Java 帽子(不情愿地,我必须补充一下)时,我对自己想,既然 Clojure 在 JVM 上运行,那么自然的方式必须是使用 JVM 异常。

当我戴上功能性帽子时,我在想一定有某种单子构造或线程宏可以以可组合的方式处理错误。

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

4

3 回答 3

20

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

Slingshot允许对抛出的异常值进行解构,从而使使用异常更加愉快。

对于允许 erlang 样式错误处理的替代方法,您应该查看dire。这篇文很好地概述了 dire 的合理性以及 Clojure 错误处理机制和缺点的概述。

于 2015-01-02T14:31:42.147 回答
5

对于一个非常实用的方法,请看一下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))

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

于 2015-09-14T07:41:05.727 回答
0

Clojure 中错误处理的官方方法是异常,因为它是 JVM 自带的。但是,函数在抛出异常时不是引用透明的,而且这个属性也不是可组合的。异常不起作用。

许多人已经在 Clojure 中尝试了不同风格的替代/单元错误处理。为此,我创建了 Promenade https://github.com/kumarshantanu/promenade ,并且有很好的使用经验。

于 2018-10-30T18:33:12.363 回答