欢迎!请访问关于页面以获取有关此功能的一些更多信息。
我在 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) 处命名空间/函数名称的无效参数...然后错误的 explain-str 表达形式
执行错误 - 在 (source.clj:nn) 处命名空间/函数名称的无效参数
我的问题是消息具有误导性——数据无效可能有其他原因,而不仅仅是“无效参数”!如果只是如下会更好吗?
执行错误 - 在 (source.clj:nn) 处在 name.space/function-name 内数据验证失败
这里发生的情况是,你意外地创建了与 spec 在仪器功能失败时创建相同的异常对象模式(特别是具有 spec explain 数据的 root cause ex-info)。这在错误打印机中被视为特殊情况。
一种解决方案是避免这种模式,例如通过将该数据从根处移出。
(ex-info "Data validation failed" {:invalid (s/explain-data int? :a)})
我将会更多地考虑是否可以更严格地选择错误打印器触发该案例的时间。