欢迎!请查阅关于页面以获取更多关于如何使用本网站的详细信息。
我在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)
当my Cursive repl处理时,这将以以下方式呈现
执行错误 - name.space/function-name在(source.clj:nn)中的无效参数...然后是错误 explaining-str的形式
执行错误 - name.space/function-name在(source.clj:nn)中的无效参数
问题在于消息具有误导性——数据无效可能有其他原因,而不仅仅是“无效参数”!如果文本只是
执行错误 - name.space/function-name在(source.clj:nn)中发生数据验证失败
这里发生的情况是你意外地创建了一个与spec在功能片段失败期间创建的相同的异常对象模式(特别是具有spec解释数据的root cause ex-info)。错误打印器将此作为特殊情况处理。
一个解决方案是避免这个模式,例如,通过将数据移动到root之外
(ex-info "Data validation failed" {:invalid (s/explain-data int? :a)})
我将进一步思考在错误打印机中是否可以更严格地控制何时触发此情况。