Clojure 中的惯用错误

主要观点:

  • Clojure 处理错误的方式多样,有抛原生异常、抛ex-info、返回错误映射等。
  • 原生异常类有时使用不便,可抛ex-info并携带数据。
  • 有时抛异常不合适,可返回错误映射,需一些实用工具辅助。
  • 可对ex-info进行结构化处理,如使用anomaliesex库。
  • 有多种处理错误的库,如pactflow等,可根据需求选择。
  • 在 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.specmalli等解决。
  • 程序员希望有断言方式,可通过写异常替代assert来解决部分问题。
阅读 27
0 条评论