欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。
我在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创建的相同的异常对象模式,这是在仪器过程中函数规范失败时发生的(特别是根原因ex-info,其ex-data是spec explain data)。这被视为错误打印器的特殊案例。
一种解决方法是不遵循该模式,例如通过将该数据从根中移除
(ex-info "Data validation failed" {:invalid (s/explain-data int? :a)})
我需要更仔细地考虑是否可以在错误打印程序中选择触发这个情况的时间。