请在 2024 年 Clojure 调查问卷! 分享您的想法。

欢迎!有关如何操作,请参阅 关于 页面以获取更多信息。

0
Spec

目前,如果规范调用失败(返回 :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)。

一种更简单的方法可能只是允许在收敛函数内部抛出错误,并将错误合并/关联到解释映射中(但在我看来可能有些过于侵入)。

1 个答案

0
参考:https://clojure.atlassian.net/browse/CLJ-2115(由 mpenet 报告)
...