欢迎!请参阅 关于 页面获取更多信息。
我在 if-let 中使用 s/explain-data 来决定是否一条数据有效或抛出异常
if-let
s/explain-data
(if-let [explanation (s/explain-data spec x)] (throw (ex-info "Invalid" explanation)) x)
(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 形式
执行错误 - 在 (source.clj:nn) 处的 name.space/function-name 参数无效
我的问题是信息太过误导——数据无效可能不只是因为“无效参数”!信息是否可以更简单,例如
执行错误 - 在 name.space/function-name 处 (source.clj:nn) 数据验证失败
这里发生的事情是,你无意中创建了一个与 spec 在仪器过程中的函数规范失败时创建的相同异常对象模式(特别是,它是一个带有 spec 说明数据的 root cause ex-info)。这被错误打印程序作为特殊情况处理。
一种解决方法是不采用该模式,例如将数据从根目录移出。
(ex-info "Data validation failed" {:invalid (s/explain-data int? :a)})
我需要再考虑一下我们是否可以在错误打印机中更挑剔地触发此案例。