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) 处命名空间/函数名称的无效参数
...然后错误的 explain-str 表达形式

我的问题是消息具有误导性——数据无效可能有其他原因,而不仅仅是“无效参数”!如果只是如下会更好吗?

执行错误 - 在 (source.clj:nn) 处在 name.space/function-name 内数据验证失败

1 个答案

+1

编辑

这里发生的情况是,你意外地创建了与 spec 在仪器功能失败时创建相同的异常对象模式(特别是具有 spec explain 数据的 root cause ex-info)。这在错误打印机中被视为特殊情况。

一种解决方案是避免这种模式,例如通过将该数据从根处移出。

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

我将会更多地考虑是否可以更严格地选择错误打印器触发该案例的时间。

by
由于“魔法”在这里正在发生,对于测量故障是否使用特定于测量的 :: 键与 ex-data 的哈希映射会更好,这样“魔法”处理就不会在“正常”用户异常中触发吗?

看起来在用户代码中抛出来自 s/explain-data 的 ex-info 可能很常见?
by
确实不错,Sean。非常感谢你们两个人的非常迅速的反馈!
...