当前位置: 首页 > 知识库问答 >
问题:

Clojure.spec验证的有意义的错误消息:pre

何志业
2023-03-14

我利用最后几天在Clojure和ClojureScript中深入挖掘了Clojure.spec。

到目前为止,我发现在依赖某种格式的数据的公共函数中,在:pre:post中使用规范作为警卫是非常有用的。

(defn person-name [person]
  {:pre [(s/valid? ::person person)]
   :post [(s/valid? string? %)]}
  (str (::first-name person) " " (::last-name person)))

有没有人知道如何在:pre:post防护中获得更好的错误消息

我知道conformexplain*,但这对那些:pre:post警卫没有帮助。

共有1个答案

葛晔
2023-03-14

在较新的alphas中,现在有s/assert,可用于断言输入或返回值与规范匹配。如果有效,则返回原始值。如果无效,则会抛出一个断言错误和解释结果。断言可以打开或关闭,甚至可以选择从编译的代码中完全省略,以对生产没有任何影响。

(s/def ::first-name string?)
(s/def ::last-name string?)
(s/def ::person (s/keys :req [::first-name ::last-name]))
(defn person-name [person]
  (s/assert ::person person)
  (s/assert string? (str (::first-name person) " " (::last-name person))))

(s/check-asserts true)

(person-name 10)
=> CompilerException clojure.lang.ExceptionInfo: Spec assertion failed
val: 10 fails predicate: map?
:clojure.spec/failure  :assertion-failed
 #:clojure.spec{:problems [{:path [], :pred map?, :val 10, :via [], :in []}], :failure :assertion-failed}
 类似资料:
  • 当我们在OSB 12c中添加Validate Node以根据XSD验证传入请求时,如果验证失败,则在某些错误消息中会显示导致验证错误的字段名。但仅对于十进制值,错误消息只显示Invalid decimal Value,而没有提及引发错误的字段。我们能克服这个问题吗

  • 我为Money类编写了一个自定义Hibernate验证约束: 它工作正常,除了错误信息。我看到了非常奇怪的行为:找到了资源包,消息按名称解析,但它被包裹在特殊的字符中,如果消息不能按名称解析,通常会出现这些字符: 此处

  • 对于错误的响应,是否可能在响应中返回验证注释消息?我认为这是可能的,但我注意到我们的项目没有给出详细的不良请求信息。 如果请求缺少IDField,我希望返回“IDField is required”。我用的是泽西2.0。我看到的回应是...

  • 我在Codeigniter中为表单验证创建了一个自定义函数。它连接到URL帮助器,我通过制作MY_URL_帮助器实现了这一点。 助手修改: 我如何称呼验证: 美元这个- 语言文件: 但是提交表单时不会显示任何错误信息。如果我将valid_url函数更改为true和false,它将执行该函数。所以它运行这个函数。 如何使错误消息出现?

  • 我在数据库上实现查询层,使用和Spring Boot项目在sql数据库上执行CRUD操作。在GraphQL模式中,我提到了一些必须的字段,当这些字段在查询中没有提到时,它会以默认格式返回状态代码的错误消息。 错误: 这是我的代码与层架构模式 控制器: 服务: 配置: BookDataFetcher: 上面的代码按预期工作,但我这里的问题是如何自定义错误消息?在错误消息中,我想提及状态,因为这是来自

  • 我有一个jQuery ajax调用,在IE中运行良好,但在Chrome和Firefox中不断出错。我的应用程序中的其他地方也有类似的ajax调用,它们在所有浏览器中都运行良好,但由于某种原因,这个浏览器不行。 首先,我在这里做的事情会在IE之外的浏览器中中断吗?其次,同样重要的是,有没有办法从< code>error: function (e) {}块中得到一些有意义的东西?