目前,如果校验调用失败(返回 :clojure.spec/invalid),无法提供有关失败原因的额外信息。虽然我们有获取 explain-data 的可能性,但最多只能返回规范格式、原始值和一些元数据。
虽然在大多数情况下这很好,但某些校验器函数在失败时可以提供对消费者有用的额外数据。一个实际的例子是我们有一个可以包含基于 String 的 DSL(如 SQL)值的规范,这些值将被校验到解析后的抽象语法树(AST)。当校验封装函数失败时,它会抛出一个带有行/列信息和更多关于失败元数据的 ex-info。但由于只能返回:clojure.spec/invalid,所有这些数据都丢失了。所有这些都在规则引擎模式内部发生,包含数百个此类事件;重新解析失败的值为错误报告是我们要避免的。
建议支持新返回值,以便传递关于校验失败的数据,或者同时支持这个新值和:clojure.spec/invalid。
这可能具有如(explain-info {..})这样的形式,它可能由校验器函数返回以供稍后由 explain 消费,以匹配 Clojure 语义与异常(ex-info/ex_data、explain-info/explain-data)。
一种更简单的实现可能只是允许在校验器函数内部抛出错误,并将错误合并/关联到 explain 映射中(但从我的观点来看,这可能有点过于侵入)。