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

欢迎!请查看关于页面,了解更多关于该工作原理的信息。

+1 投票
错误
已关闭

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

(:kw "one" "two" "three") => java.lang.IllegalArgumentException: 错误的数量传递给关键字::kw

与调用一个{{IFn}}进行比较,它可以显示出传递的参数数量

(name "one" "two" "three") => clojure.lang.ArityException: 向core/name传递了错误数量的参数(3)

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

附带补丁重新使用其他地方使用的{{ArityException}}类,用于在调用关键字时使用错误的参数数量时生成后来的错误信息形式。

解决 CLJ-1067

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

审核人: Alex Miller

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

17 个回答

0 投票

评论者:marc

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

0 投票

评论者:ataggart

+100SZ对于改善错误信息。

虽然不太可能,但由于throwArity()是一个公共方法,移除它可能会破坏外部代码。

其次,由于有三个冒号,生成的句子看起来有点别扭。
"向:关键字::my.ns/foo传入了错误的参数数量(3)"

另一种方案
"向:关键字 :my.ns/foo传入了错误的参数数量(3)"
"向::my.ns/foo传入了错误的参数数量(3)"

后一个与调用非关键字函数的结果相似
"向:my.ns/bar传入了错误的参数数量(3)"

0 投票

评论者:alexmiller

此外,实际上在测试中有一个打字错误,艺术体-异常。

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

0 投票

评论者:marc

附加更新补丁。

0 投票

评论者:marc

我已经附上了更新补丁,该补丁修复了{{deftest}}声明中的类型错误,并以Alexander建议的方式格式化异常信息。

Alex - 需要我为Keyword.throwArtity()的0个参数版本添加一个Java注释来说明其存在的理由吗?比如

/** * @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 投票

评论者:alexmiller

我已经筛选过,但不确定我们是否会在1.10时查看它。如果需要,我会重新基准,这都不是什么大问题。

...