2024年Clojure状态调查!分享您的想法。

欢迎!请查阅关于页面以获取更多关于如何使用本网站的详细信息。

+1
错误

我在if-let中使用s/explain-data来决定是否一次性验证某些数据是否有效,或者应该抛出异常。

(if-let [explanation (s/explain-data spec x)]
(throw (ex-info "Invalid" explanation))
x)

当my Cursive repl处理时,这将以以下方式呈现

执行错误 - name.space/function-name在(source.clj:nn)中的无效参数
...然后是错误 explaining-str的形式

问题在于消息具有误导性——数据无效可能有其他原因,而不仅仅是“无效参数”!如果文本只是

执行错误 - name.space/function-name在(source.clj:nn)中发生数据验证失败

1个答案

+1

编辑

这里发生的情况是你意外地创建了一个与spec在功能片段失败期间创建的相同的异常对象模式(特别是具有spec解释数据的root cause ex-info)。错误打印器将此作为特殊情况处理。

一个解决方案是避免这个模式,例如,通过将数据移动到root之外

(ex-info "Data validation failed" {:invalid (s/explain-data int? :a)})

我将进一步思考在错误打印机中是否可以更严格地控制何时触发此情况。

by
既然这里发生了“魔幻”,对于仪表化故障,是否最好使用一个特定于仪表化的 :: key 的 ex-data 哈希表,这样“魔幻”的加工永远不会触发“正常”的用户异常?

看起来在用户代码中,将 ex-info 抛出位置是 s/explain-data 比较普遍?
by
是的,这听起来不错,Sean。感谢你们两位迅速的反馈!
...