Error handling 我可以在前置和后置条件中包含一条消息吗

Error handling 我可以在前置和后置条件中包含一条消息吗,error-handling,clojure,Error Handling,Clojure,我有这个(不是(一些#(=(:长度%1)0)%)作为后置条件。这样写很清楚,但如果不满足这个条件,我会得到: Assert failed: (not (some (fn* [p1__17852#] (= (:length p1__17852#) 0)) %)) 这不是很可读。有没有一种方法可以为后置条件或先决条件定义消息 编辑1: 遵循noahlz和NoiseSmith的建议(但使用外部命名函数): 给出: AssertionError Assert failed: (not-zero-len

我有这个
(不是(一些#(=(:长度%1)0)%)
作为后置条件。这样写很清楚,但如果不满足这个条件,我会得到:

Assert failed: (not (some (fn* [p1__17852#] (= (:length p1__17852#) 0)) %))
这不是很可读。有没有一种方法可以为后置条件或先决条件定义消息

编辑1:

遵循noahlz和NoiseSmith的建议(但使用外部命名函数):

给出:

AssertionError Assert failed: (not-zero-length %)

以下clojure邮件列表将对此进行讨论

查看clojure.core,您可以看到fn宏只将布尔值传递给assert函数,而不包括用于传递附加消息参数的可选参数


所以看起来还没有办法做到干净

扩展上述建议:

(not (some (fn zero-length [item] (= (:length item) 0)) %))
命名匿名函数时,任何涉及该fn的错误都将更具可读性

还有,你怎么会在上面有两个%的替换#()不嵌套。

在同一线程中,这建议使用clojure.test/is宏,该宏返回有意义的错误消息

(require '[clojure.test :refer [is]])

(defn get-key [m k]
  {:pre [(is (map? m) "m is not a map!")]}
  (m k))

(get-key [] 0)
返回

FAIL in clojure.lang.PersistentList$EmptyList@1 (form-init8401797809408331100.clj:2)
m is not a map!
expected: (map? m)
  actual: (not (map? []))
AssertionError Assert failed: (is (map? m) "m is not a map!")  

这条线索已经有两年半的历史了,没有任何有决策权的人对它发表评论。我不会说正在考虑包含此功能。解决方案似乎是在断言中不使用更具描述性的函数名(而不是内联函数)。更新的答案反映了amalloy指出的内容。在后置条件中,%给出了函数的返回值。我想另一个使用
(fn…
而不是
#(…)
的原因是。这个答案解决了我的这个问题。在测试之外使用clojure.test/is会弄乱你的测试统计数据。当您运行测试时,它将报告比测试中实际发生的情况高得多的“断言数”。因此,我不推荐这种方法。
FAIL in clojure.lang.PersistentList$EmptyList@1 (form-init8401797809408331100.clj:2)
m is not a map!
expected: (map? m)
  actual: (not (map? []))
AssertionError Assert failed: (is (map? m) "m is not a map!")