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