Clojure 中惯用的错误处理

Idiomatic error handling in Clojure

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

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

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

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

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

Slingshot 通过允许对抛出的异常值进行解构等方式,使异常的使用更加愉快。

对于允许 erlang 式错误处理的替代方案,您应该查看 dire. This blog post 对 dire 的合理性以及 Clojure 错误处理机制和缺点的概述。

对于非常实用的方法,请查看 cats,它对应于 "some kind of monadic construction":

Category Theory and Algebraic abstractions for Clojure and 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,只是您不必手动检查任何内容。

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

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