2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面,了解更多关于这个网站如何运作的信息。

0
Spec

异常抛出在这行
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,`ExceptionInfo` 在第 31 行抛出异常。

一个简单的修复可能是
(apply ex-info (remove nil? (link: "基于规范检查失败" (when-not ...))))

但这实际上只是在掩饰问题,并没有为失败者提供可操作的信息。

不幸的是,我没有最小化测试用例,因为这涉及专有代码(且很复杂)。

也许作者阅读代码后会更有洞察力。

以下是完整的堆栈跟踪

(链接:[clojure.lang.ExceptionInfo "ExceptionInfo.java" 31] [链接:clojure.lang.ExceptionInfo "ExceptionInfo.java" 22] [链接:clojure.core$ex_info invokeStatic "core.clj" 4739] [链接:clojure.core$ex_info invoke "core.clj" 4739] [链接:clojure.spec.test.alpha$explain_check invokeStatic "alpha.clj" 277] [链接:clojure.spec.test.alpha$explain_check invoke "alpha.clj" 275] [链接:clojure.spec.test.alpha$check_call invokeStatic "alpha.clj" 295] [链接:clojure.spec.test.alpha$check_call invoke "alpha.clj" 285] [链接:clojure.spec.test.alpha$quick_check$fn__2986 invoke "alpha.clj" 308] [链接:clojure.lang.AFn applyToHelper "AFn.java" 154] [链接:clojure.lang.AFn applyTo "AFn.java" 144] [链接:clojure.core$apply invokeStatic "core.clj" 657] [链接:clojure.core$apply invoke "core.clj" 652] [链接:clojure.test.check.properties$apply_gen$fn__16139$fn__16140 invoke "properties.cljc" 30] [链接:clojure.test.check.properties$apply_gen$fn__16139 invoke "properties.cljc" 29] [链接:clojure.test.check.rose_tree$fmap invokeStatic "rose_tree.cljc" 77] [链接:clojure.test.check.rose_tree$fmap invoke "rose_tree.cljc" 73] [链接:clojure.test.check.generators$fmap$fn__9199 invoke "generators.cljc" 101] [链接:clojure.test.check.generators$gen_fmap$fn__9173 invoke "generators.cljc" 57] [链接:clojure.test.check.generators$call_gen invokeStatic "generators.cljc" 41] [链接:clojure.test.check.generators$call_gen invoke "generators.cljc" 37] [链接:clojure.test.check$quick_check invokeStatic "check.cljc" 94] [链接:clojure.test.check$quick_check doInvoke "check.cljc" 37] [链接:clojure.lang.RestFn invoke "RestFn.java" 425] [链接:clojure.lang.AFn applyToHelper "AFn.java" 156] [链接:clojure.lang.RestFn applyTo "RestFn.java" 132] [链接:clojure.core$apply invokeStatic "core.clj" 657] [链接:clojure.core$apply invoke "core.clj" 652] [链接:clojure.spec.gen.alpha$quick_check invokeStatic "alpha.clj" 29] [链接:clojure.spec.gen.alpha$quick_check doInvoke "alpha.clj" 27] [链接:clojure.lang.RestFn applyTo "RestFn.java" 137] [链接:clojure.core$apply invokeStatic "core.clj" 661] [链接:clojure.core$apply invoke "core.clj" 652] [链接:clojure.spec.test.alpha$quick_check invokeStatic "alpha.clj" 309] [链接:clojure.spec.test.alpha$quick_check invoke "alpha.clj" 302] [链接:clojure.spec.test.alpha$check_1 invokeStatic "alpha.clj" 335] [链接:clojure.spec.test.alpha$check_1 invoke "alpha.clj" 323] [链接:clojure.spec.test.alpha$check$fn__3005 invoke "alpha.clj" 411] [链接:clojure.core$pmap$fn__8105$fn__8106 invoke "core.clj" 6942] [链接:clojure.core$binding_conveyor_fn$fn__5476 invoke "core.clj" 2022] [链接:clojure.lang.AFn call "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])

16 答案

0

评论由:johanatan 提供

因此,我终于追踪到这样一个实际问题,即我的功能从测试函数返回时会抛出异常。

此补丁可以帮助人们指向这个方向(尽管更好的做法是揭示/解释根本的失败,而不仅仅是暗示)。

0

评论由:johanatan 提供

有人会回应这个吗?通常对补丁/拉取请求的反馈所需时间是多少?

0

评论由:alexmiller 发出

这里没有足够的信息来操作这个工单。如果(s/valid? spec data)为假,那么(s/explain-data spec data)不应该为nil。你在看到这一点的情况下表明了spec实现中的一个bug,但因为没有更多关于spec或数据的细节,我目前无法做任何事情。

0

评论由:johanatan 提供

“可以行动的”部分是指提交的补丁。这段代码对问题受影响的人更加有韧性且友好。

这个工单的实际文本仅仅是原始工单的一个CLONE(因为我无法重新打开或编辑原始工单)。

0

评论由:johanatan 提供

即,我唯一能够提交这个补丁的方法是创建一个CLONE。

0

评论由:jafingerhut 发出

Jonathan,既然你在Clojure贡献者名单上,我已经提高了你在Clojure JIRA上的权限,你现在应该能够编辑工单了。

我认为没有什么“通常时间”来回应工单。这可能会因问题的清晰程度和感知的紧急程度而有很大差异。

Alex可能会欣赏如果描述中包括一个可以复现问题的示例,这样他们可能会考虑其他解决问题的方法。

0

评论由:alexmiller 发出

这个补丁解决了症状,而不是问题。我们真正需要的是引起问题的spec和数据值。

0

评论由:johanatan 提供

补丁确实实现了其所声明的功能:为这种场景提供了更好的通信。

不幸的是,我尝试从头开始构造最小复现的尝试并不成功。我理解您希望我进行更多工作,但迄今为止我所做的一切工作都是无偿的,我现在无法在这个问题上再投入更多时间。

我们应该单独讨论这个补丁的优点---它是否比之前的代码有所改进?(链接:并且静态的人工分析可以确定它确实是一个改进)。这里的“根本问题”在于s/valid?s/explain-data并不是纯函数或全函数--它们可能会根据论证失败(即当涉及高阶函数时(链接:因为规格的基本限制,只能通过通过随机数据通过它来“验证”))。实际上,鉴于这个限制,我想不出任何更好的方法来解决这个问题的(除了将异常向上抛出,这在我在原始的真实世界复现中的确被吞尾,但在最小复现尝试中却没有)。

0

评论由:johanatan 提供

请回复我对提供的理由。

0

评论者:gshayban

没有复现用例,恐怕这不会向前推进。如果存在被破坏的不变量(例如,无效的数据但缺少explain-data),请提供一个示例。它不需要是最小的,只需要可复现。

(链接:1) https://dev.clojure.org/display/community/Creating Tiles
(链接:2) https://dev.clojure.org/display/community/Developing Patches(请参阅代码前)

0

评论由:johanatan 提供

因此,您是否在说Clojure项目不接受通过人工检查发现的错误报告?因为如果它接受,那么您应该考虑这个错误报告是这种情况的一例。

此外,如果您仅允许自己思考这两个问题中的函数,您就可以“发现”自己的错误。您是否接受s/explain-datas/valid?不是纯粹的决定性?也就是说,它们在不同的两次运行中,在给出相同的输入时,可以返回与彼此和自己不同的结果。如果您接受这一点,那么您已经说服自己这个错误断言是有效的(我强烈敦促您接受这一点,因为这是现状的真实反映)。

0

评论者:gshayban

我正在尝试帮助您制定一个更好、可操作的票证。我并不是代表‘Clojure项目’发表意见。我恳求您缓和敌对态度。诸如“如果您仅仅允许自己思考这两个问题中的函数”这样的语言不适用于这里。

我毫不怀疑您已经发现了一个问题,但现状下这是无法行动的。

0

评论由:johanatan 提供

我认为您应该回过头去重新阅读我之前的消息。想象它在被平静、直率地表达时是什么样的,因为这就是它的书写/意图(而不是您选择阅读它的方式)。此外,这并不是新的信息——仅仅是对先前通信(似乎没有理解)的重述。

我真的很不喜欢你在给我的上一条消息中的道貌岸然、压制性的态度。将道德判断留在其他更合适的地方(无论在何处)。与技术错误报告无关。

0

评论由:alexmiller 发出

关于非确定性,这是在CLJ-1949中跟踪的已知问题。假设这得到了解决,我认为不需要这个更改。但是,我不确定所有这些都会去哪里,所以我只是留下了这个票证并推迟到以后更清楚时再做决定。

0

评论由:johanatan 提供

啊,是的,如果CLJ-1949修正了,那么这就不会成为问题。感谢您(合理的)解释。

...