请在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创建的相同的异常对象模式,这是在仪器过程中函数规范失败时发生的(特别是根原因ex-info,其ex-data是spec explain data)。这被视为错误打印器的特殊案例。

一种解决方法是不遵循该模式,例如通过将该数据从根中移除

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

我需要更仔细地考虑是否可以在错误打印程序中选择触发这个情况的时间。

因为这里正在发生“魔法”,在检测失败时使用特定于检测的 :: 键的 ex-data 哈希表是不是更好,这样就不会在“常规”用户异常中触发那个“魔法”处理?

看起来在用户代码中抛出 from s/explain-data 的 ex-info 可能相当常见?
是的,Sean,这个主意听起来不错。感谢你们的快速反馈!
...