当我戴上 C 帽子时,我想也许惯用的 Clojure 只是做简单的事情并检查返回值。
当我戴上我的 Java 帽子(不情愿地,我必须补充一下)时,我对自己想,既然 Clojure 在 JVM 上运行,那么自然的方式必须是使用 JVM 异常。
当我戴上功能性帽子时,我在想一定有某种单子构造或线程宏可以以可组合的方式处理错误。
那么在 Clojure 程序中处理错误的惯用方法是什么?
当我戴上 C 帽子时,我想也许惯用的 Clojure 只是做简单的事情并检查返回值。
当我戴上我的 Java 帽子(不情愿地,我必须补充一下)时,我对自己想,既然 Clojure 在 JVM 上运行,那么自然的方式必须是使用 JVM 异常。
当我戴上功能性帽子时,我在想一定有某种单子构造或线程宏可以以可组合的方式处理错误。
那么在 Clojure 程序中处理错误的惯用方法是什么?
对于一个非常实用的方法,请看一下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
,除了您不必手动检查任何内容。
Clojure 中错误处理的官方方法是异常,因为它是 JVM 自带的。但是,函数在抛出异常时不是引用透明的,而且这个属性也不是可组合的。异常不起作用。
许多人已经在 Clojure 中尝试了不同风格的替代/单元错误处理。为此,我创建了 Promenade https://github.com/kumarshantanu/promenade ,并且有很好的使用经验。