主要观点:
- Clojure 处理错误的方式多样,有抛原生异常、抛
ex-info、返回错误映射等。 - 原生异常类有时使用不便,可抛
ex-info并携带数据。 - 有时抛异常不合适,可返回错误映射,需一些实用工具辅助。
- 可对
ex-info进行结构化处理,如使用anomalies或ex库。 - 有多种处理错误的库,如
pact、flow等,可根据需求选择。 - 在 JVM Clojure 中要避免捕获和抛出
Error,可通过写替代assert的异常来解决。
关键信息:
- 抛原生异常示例:
(when-not (blah blah) (throw (IllegalArgumentException. "foo can’t baz")))或(throw (js/Error. "Oops!"))。 - 抛
ex-info示例:(throw (ex-info "Foo is borked" (select-keys foo […])))。 - 返回错误映射示例:
{:ok false :foo …}或{:failure :fail.baz/missing-foo, :bar :baz, …}。 anomalies通过::anom/category键分类失败。ex库创建类似多方法的异常层次结构。- 避免捕获和抛出
Error的原因及解决方法。
重要细节:
- 不同处理错误方式在不同情境下有用,可共存于同一项目。
- 对于处理错误的库,可根据需求选择,如可视化它们在“Either Monad-ness”频谱上的位置。
- 由于 Clojure 不强制函数参数约束,需用
clojure.spec或malli等解决。 - 程序员希望有断言方式,可通过写异常替代
assert来解决部分问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。