抛出异常的这行代码
https://github.com/clojure/clojure/blob/clojure-1.9.0/src/jvm/clojure/lang/ExceptionInfo.java#L31
由于这个调用
https://github.com/clojure/spec.alpha/blob/spec.alpha-0.1.143/src/main/clojure/clojure/spec/test/alpha.clj#L279
如果`when-not`返回nil,则在31行抛出`ExceptionInfo`异常。
一个简单的修正可能是
(apply ex-info (remove nil? (link: "基于规格的检查失败" (when-not ...))))
尽管这实际上只是掩盖了问题,并没有为失败者提供可操作的信息。
遗憾的是,我没有最小化测试案例,因为这代码是专有和复杂的。
或许阅读代码的作者会有更多的洞察。
以下是完整的堆栈跟踪
(链接:[clojure.lang.ExceptionInfo "ExceptionInfo.java" 31] (链接:clojure.lang.ExceptionInfo "ExceptionInfo.java" 22) (链接:clojure.core$ex_info 调用静态 "core.clj" 4739) (链接:clojure.core$ex_info 调用 "core.clj" 4739) (链接:clojure.spec.test.alpha$explain_check 调用静态 "alpha.clj" 277) (链接:clojure.spec.test.alpha$explain_check 调用 "alpha.clj" 275) (链接:clojure.spec.test.alpha$check_call 调用静态 "alpha.clj" 295) (链接:clojure.spec.test.alpha$check_call 调用 "alpha.clj" 285) (链接:clojure.spec.test.alpha$quick_check$fn__2986 调用 "alpha.clj" 308) (链接:clojure.lang.AFn 调用帮助 "AFn.java" 154) (链接:clojure.lang.AFn 调用 "AFn.java" 144) (链接:clojure.core$apply 调用静态 "core.clj" 657) (链接:clojure.core$apply 调用 "core.clj" 652) (链接:clojure.test.check.properties$apply_gen$fn__16139$fn__16140 调用 "properties.cljc" 30) (链接:clojure.test.check.properties$apply_gen$fn__16139 调用 "properties.cljc" 29) (链接:clojure.test.check.rose_tree$fmap 调用静态 "rose_tree.cljc" 77) (链接:clojure.test.check.rose_tree$fmap 调用 "rose_tree.cljc" 73) (链接:clojure.test.check.generators$fmap$fn__9199 调用 "generators.cljc" 101) (链接:clojure.test.check.generators$gen_fmap$fn__9173 调用 "generators.cljc" 57) (链接:clojure.test.check.generators$call_gen 调用静态 "generators.cljc" 41) (链接:clojure.test.check.generators$call_gen 调用 "generators.cljc" 37) (链接:clojure.test.check$quick_check 调用静态 "check.cljc" 94) (链接:clojure.test.check$quick_check doInvoke "check.cljc" 37) (链接:clojure.lang.RestFn 调用 "RestFn.java" 425) (链接:clojure.lang.AFn 调用帮助 "AFn.java" 156) (链接:clojure.lang.RestFn 调用 "RestFn.java" 132) (链接:clojure.core$apply 调用静态 "core.clj" 657) (链接:clojure.core$apply 调用 "core.clj" 652) (链接:clojure.spec.gen.alpha$quick_check 调用静态 "alpha.clj" 29) (链接:clojure.spec.gen.alpha$quick_check doInvoke "alpha.clj" 27) (链接:clojure.lang.RestFn 调用 "RestFn.java" 137) (链接:clojure.core$apply 调用静态 "core.clj" 661) (链接:clojure.core$apply 调用 "core.clj" 652) (链接:clojure.spec.test.alpha$quick_check 调用静态 "alpha.clj" 309) (链接:clojure.spec.test.alpha$quick_check 调用 "alpha.clj" 302) (链接:clojure.spec.test.alpha$check_1 调用静态 "alpha.clj" 335) (链接:clojure.spec.test.alpha$check_1 调用 "alpha.clj" 323) (链接:clojure.spec.test.alpha$check$fn__3005 调用 "alpha.clj" 411) (链接:clojure.core$pmap$fn__8105$fn__8106 调用 "core.clj" 6942) (链接:clojure.core$binding_conveyor_fn$fn__5476 调用 "core.clj" 2022) (链接:clojure.lang.AFn 调用 "AFn.java" 18) (链接:java.util.concurrent.FutureTask run "FutureTask.java" 266) (链接:java.util.concurrent.ThreadPoolExecutor runWorker "ThreadPoolExecutor.java" 1149) (链接:java.util.concurrent.ThreadPoolExecutor$Worker run "ThreadPoolExecutor.java" 624) (链接:java.lang.Thread run "Thread.java" 748))