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 ...))))

尽管这实际上只是掩盖了问题,并没有为失败者提供可操作的信息。

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

也许作者在阅读代码后会更有见解。

这是完整的堆栈跟踪

(link: [clojure.lang.ExceptionInfo "ExceptionInfo.java" 31) (link: clojure.lang.ExceptionInfo "ExceptionInfo.java" 22) (link: clojure.core$ex_info invokeStatic "core.clj" 4739) (link: clojure.core$ex_info invoke "core.clj" 4739) (link: clojure.spec.test.alpha$explain_check invokeStatic "alpha.clj" 277) (link: clojure.spec.test.alpha$explain_check invoke "alpha.clj" 275) (link: clojure.spec.test.alpha$check_call invokeStatic "alpha.clj" 295) (link: clojure.spec.test.alpha$check_call invoke "alpha.clj" 285) (link: clojure.spec.test.alpha$quick_check$fn__2986 invoke "alpha.clj" 308) (link: clojure.lang.AFn applyToHelper "AFn.java" 154) (link: clojure.lang.AFn applyTo "AFn.java" 144) (link: clojure.core$apply invokeStatic "core.clj" 657) (link: clojure.core$apply invoke "core.clj" 652) (link: clojure.test.check.properties$apply_gen$fn__16139$fn__16140 invoke "properties.cljc" 30) (link: clojure.test.check.properties$apply_gen$fn__16139 invoke "properties.cljc" 29) (link: clojure.test.check.rose_tree$fmap invokeStatic "rose_tree.cljc" 77) (link: clojure.test.check.rose_tree$fmap invoke "rose_tree.cljc" 73) (link: clojure.test.check.generators$fmap$fn__9199 invoke "generators.cljc" 101) (link: clojure.test.check.generators$gen_fmap$fn__9173 invoke "generators.cljc" 57) (link: clojure.test.check.generators$call_gen invokeStatic "generators.cljc" 41) (link: clojure.test.check.generators$call_gen invoke "generators.cljc" 37) (link: clojure.test.check$quick_check invokeStatic "check.cljc" 94) (link: clojure.test.check$quick_check doInvoke "check.cljc" 37) (link: clojure.lang.RestFn invoke "RestFn.java" 425) (link: clojure.lang.AFn applyToHelper "AFn.java" 156) (link: clojure.lang.RestFn applyTo "RestFn.java" 132) (link: clojure.core$apply invokeStatic "core.clj" 657) (link: clojure.core$apply invoke "core.clj" 652) (link: clojure.spec.gen.alpha$quick_check invokeStatic "alpha.clj" 29) (link: clojure.spec.gen.alpha$quick_check doInvoke "alpha.clj" 27) (link: clojure.lang.RestFn applyTo "RestFn.java" 137) (link: clojure.core$apply invokeStatic "core.clj" 661) (link: clojure.core$apply invoke "core.clj" 652) (link: clojure.spec.test.alpha$quick_check invokeStatic "alpha.clj" 309) (link: clojure.spec.test.alpha$quick_check invoke "alpha.clj" 302) (link: clojure.spec.test.alpha$check_1 invokeStatic "alpha.clj" 335) (link: clojure.spec.test.alpha$check_1 invoke "alpha.clj" 323) (link: clojure.spec.test.alpha$check$fn__3005 invoke "alpha.clj" 411) (link: clojure.core$pmap$fn__8105$fn__8106 invoke "core.clj" 6942) (link: clojure.core$binding_conveyor_fn$fn__5476 invoke "core.clj" 2022) (link: clojure.lang.AFn call "AFn.java" 18) (link: java.util.concurrent.FutureTask run "FutureTask.java" 266) (link: java.util.concurrent.ThreadPoolExecutor runWorker "ThreadPoolExecutor.java" 1149) (link: java.util.concurrent.ThreadPoolExecutor$Worker run "ThreadPoolExecutor.java" 624) (link: java.lang.Thread run "Thread.java" 748)]

16 个回答

0

评论者:johanatan

因此,我最终能够追踪到这样一个实际问题:在测试函数下,我的函数返回值在特定输入上会抛出异常。

此补丁有助于将人们引向那个方向(尽管更好的做法可能是揭露/解释根本失败,而不仅仅是暗示它)。

0

评论者:johanatan

有人会对此做出回应吗?对于补丁/拉取请求的反馈通常期望多长时间?

0

评论者:alexmiller

这里的信息不足以让这个票据可操作。如果(s/valid? spec data)是false,那么(s/explain-data spec data)永远不应该为nil。你看到这个说明了一个规范实现中的bug,但因为没有更多关于规范或数据的信息,我目前无法做什么。

0

评论者:johanatan

"可操作"的部分是提交的补丁。此代码对问题的受害者更具弹性和友好。

此票据的实际文本仅是原始票据的CLONE(因为我不能重新打开或编辑原始票据)。

0

评论者:johanatan

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

0
答者:

评论者:jafingerhut

约翰逊,既然你在Clojure贡献者名单上,我已经提升你在Clojure JIRA的权限,因此你现在应该可以修改票据了。

我认为没有“通常的回复时间”。根据问题的清晰度以及被认为的关键程度,它可能有很大的差异。

如果描述中包含可以用于重现问题的示例,亚历克斯可能会感到高兴。通常,通过看到问题,他们可能会考虑其他解决方案。

0
答者:

评论者:alexmiller

这个补丁针对的是症状而不是问题。我们真正需要的是导致问题的规范和数据值。

0
答者:

评论者:johanatan

这个补丁的确做到了它声称的事情:为这种情况提供更好的消息。

遗憾的是,我尝试从头开始构建最小示例代码并未成功。我明白你需要我做更多工作,但我到目前为止所做的一切都是无偿的,我在现在这个时间点不能为此捐赠更多时间。

我们应该单独讨论这个补丁的优点-- 它是比之前的代码有改进吗?(链接:代码的静态人工分析可以确定这一点)。这里的“根本问题”在于s/valid?s/explain-data不是纯函数也不完全是函数-- 它们可能会根据参数以概率性失败(即在涉及高阶函数的情况下(链接:由于spec的根本限制,只能通过传递随机数据来“验证”它))。实际上,鉴于这些限制,我无法想象处理这个问题的更好方法(除了将异常向上冒泡,这在我的原始真实世界复现中确实是被吞掉的,但在我的最小复现尝试中并不存在)。

0
答者:

评论者:johanatan

我希望对提供的推理有所回应。

0
已回答

评论者:gshayban

没有重放案例,恐怕这个问题将无法推进。如果存在某个常量被破坏(例如,无效数据但缺少解释),请提供一个示例。不一定要最小化,只需要可重现。

链接:1 https://dev.clojure.org/display/community/Creating Tickets
链接:2 https://dev.clojure.org/display/community/Developing Patches (见在编码前)

0
已回答

评论者:johanatan

那么,您是在说Clojure项目不接受通过人工检查发现的错误报告吗?如果它是接受这样的,那么您应该将这个错误视为此类情况。

此外,如果您愿意仅仅思考这两个问题中的函数,您就可以“发现”这个错误。您是否接受s/explain-data不是纯粹确定性的?即,在不同的两次运行中,给定的相同输入可能会返回不同的结果。如果您接受这一点,那么您已经确信这个错误主张的有效性(并且我强烈敦促您接受这一点,因为这是事实所在)。

0
已回答

评论者:gshayban

我正在尝试帮助您制定一个更好、可执行的票据。我并不代表‘Clojure项目’发言。我恳求您降低敌意。如“如果您愿意仅仅思考这些有问题的两个函数”这样的语言在这里不合适。

我并不怀疑您已经发现了一个问题,但现状是无法执行的。

0
已回答

评论者:johanatan

我认为你应该回顾并重新阅读我的之前的消息。想象一下,它是以冷静、诚恳和客观的方式说出的,因为这是它被写(或打算被写)的方式(而不是你选择阅读的方式)。此外,这并不是新信息——仅仅是重新措辞了之前的沟通(似乎并没有被理解)。

我真的很不欣赏你之前给我的信息中的那种自认为是神圣的、贬低人的、居高临下的态度。将这种道德的大言炎炎留到更合适的地方去(无论在哪里)吧。在这个技术错误报告中它没有位置。

0
by

评论者:alexmiller

关于非确定性,这是一个在 CLJ-1949 中跟踪的问题。假设这已被解决,我认为不必进行此更改。然而,我不确定所有这一切将去往何处,所以我会暂时将这个工单保持开放,并推迟到事情变得更为清晰时再进行。

0
by

评论者:johanatan

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

...