请分享您的想法,参加2024年Clojure调查!

欢迎!请参阅关于页面获取更多关于这个网站的信息。

+1 投票
错误
已关闭

当你使用错误数量的参数调用关键字时,错误消息不会报告传递了多少参数

(:kw "one" "two" "three") => java.lang.IllegalArgumentException: Wrong number of args passed to keyword: :kw

与之相比,调用IFn时,会显示传递的参数数量

(name "one" "two" "three") => clojure.lang.ArityException: Wrong number of args (3) passed to: core/name

后者的错误消息更加清晰,并且更容易调试。

所附的补丁重用了在其他地方使用的{{ArityException}}类,在调用关键字时传递错误数量的参数时生成类似形式的错误消息。

解决CLJ-1067

补丁:keyword-arity-exception-03.patch

审核:Alex Miller

已标记为: 已在1.11.0-alpha2中修复

17 答复

0 投票

评论者:marc

修正拼写错误:later => latter。

0 投票

评论者:ataggart

+100分,改进错误消息。

尽管 unlikely,因为 throwArity() 是一个公开方法,移除它可能会破坏外部代码。

其次重要的是,生成的句子中使用三个冒号略显awkward
"向关键词::my.ns/foo传递的参数数量不正确 (3)"

或者
"向关键词::my.ns/foo传递的参数数量不正确 (3)"
"向:my.ns/foo传递的参数数量不正确 (3)"

后者与调用非关键词函数时的结果相类似
"向my.ns/bar传递的参数数量不正确 (3)"

0 投票

由:alexmiller 发表评论

此外,实际上测试中存在一个typos:arity-exceptions。

并且我同意Alexander的评论,应保留现有的throwArity()。

0 投票

评论者:marc

附加更新补丁。

0 投票

评论者:marc

我附加了一个更新补丁,修复了{{deftest}}声明中的类型错误,并根据Alexander的建议格式化异常信息。

Alex - 我应该在Java注释中添加有关为何Keyword.throwArity()的0参数版存在的原因吗?例如

/* @deprecated CLJ-2350 此函数不再被调用,但尚未删除,以维护公共接口。 */

从公共接口的反思中,或许我们可以使新函数 {{throwArity(int n)}} 成为包私有。这将避免它成为{{clojure.lang}}的公共API的一部分。

0 投票

由:alexmiller 发表评论

是的,是的

0 投票

评论者:marc

添加了将 {{throwArity(int)}} 设置为包私有的补丁,并添加了弃用文档字符串。

0 投票

由:alexmiller 发表评论

最后的调用作为最后一个参数接收可变参数,实际上应该是21+,而不是21。可以计算参数数组。补丁已经从master分支漂移,需要重新合并。

0 投票

评论者:marc

增加了补丁,改进了21+参数情况的消息。

0 投票
0 投票

由:alexmiller 发表评论

当然,但需要单独的工单。

0 投票

评论者:marc

嗨,Alex,这个工单有什么更新吗?我已经根据您的要求更新了补丁到最新的master分支,所以现在应该可以合并了。

0 投票
评论者:alexmiller

下次我会轮到它。
0 投票
评论者:marc_

嗨,Alex,

这个工单有什么更新吗?我担心再次需要重新对master分支进行合并补丁。

马克
0 投票
by

由:alexmiller 发表评论

我已经筛选了,但我不确定我们会为1.10查看它。如果需要,我将重新整合,没有大问题。

...