主要观点:
- 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。