请参与 2024 年 Clojure 状态调查!

欢迎!请参阅 关于 页面获取更多信息。

+1投票
错误

我在 if-let 中使用 s/explain-data 来决定是否一条数据有效或抛出异常

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

当我的 Cursive repl 处理这个时,它被 渲染为

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

我的问题是信息太过误导——数据无效可能不只是因为“无效参数”!信息是否可以更简单,例如

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

1 个答案

+1投票

编辑

这里发生的事情是,你无意中创建了一个与 spec 在仪器过程中的函数规范失败时创建的相同异常对象模式(特别是,它是一个带有 spec 说明数据的 root cause ex-info)。这被错误打印程序作为特殊情况处理。

一种解决方法是不采用该模式,例如将数据从根目录移出。

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

我需要再考虑一下我们是否可以在错误打印机中更挑剔地触发此案例。

由于这里发生了“魔法”,对于功能失败使用具有特定于功能的 :: 键的 ex-data 哈希表是否更好,这样“魔法”处理就不会在“正常”用户异常中触发了?

在用户代码中,似乎抛出来自 s/explain-data 的 ex-info 可能相当常见?
谢谢 Sean,听起来不错。感谢你们两人的超快速反馈!
...