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

欢迎!有关此如何工作的更多信息,请参阅关于页面。

0
错误

关键字函数应在错误输入上抛出异常而不是返回nil。

user=> (keyword 5) nil user=> (keyword []) nil

原因:关键字函数被定义为cond,具有关键字、符号和字符串的情况。没有:else,所以所有其他情况都返回nil。

建议:在关键字函数中添加一个:else分支,并抛出异常。

补丁

5 个答案

0

评论者:ericnormand

关键字函数应在错误的参数类型上抛出IllegalArgumentException而不是返回nil。为了保持一致性,当两个参数都不是字符串时,应该抛出IllegalArgumentException。

find-keyword函数应该有类似的行为以保持相同的签名。

当前行为

user=> (keyword 5)
nil
user=> (keyword (link: ))
nil
user=> (keyword 1 1)
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

原因:关键字函数被定义为cond,具有关键字、符号和字符串的情况。没有:else,所以所有其他情况都返回nil。find-keyword的情况也是如此,它应该以相同的方式行为。有两种参数的情况确实抛出了异常,但消息并不是很有帮助。

建议:我在cond中添加了一个:else分支,并抛出一个IllegalArgumentException,其中包含指示可接受类型的消息,并打印实际参数。我还在find-keyword中进行了相同的修改。还有一些简单的测试。

补丁:keyword-1341-2014-02-12.patch

注意:此更改检查不了所有有误的输入,只检查类型。例如,依然可以传递包含“非法”关键字字符的字符串。

0
by

评论由:alexmiller发表

嗨Eric,感谢你的补丁!将1个参数更改看起来很不错。

对于2个参数的更改,我有些担忧——我担心我们在关键字创建这个相当热的环境中加入了新的检查。2个参数的路径不是一个静默失败,因为你将得到一个ClassCastException,所以我认为在这里添加这些检查不值得。在你处理1-参数情况时,你已经通过了else部分,所以没有额外的成本。

0
by

评论者:ericnormand

我明白了。我会移除二参数的情况。

0
by

评论者:ericnormand

关键字函数应该在收到错误参数类型时抛出IllegalArgumentException异常,而不是返回nil。二参数情况已经抛出了异常。

find-keyword函数应该有类似的行为以保持相同的签名。

当前行为

user=> (keyword 5)
nil
user=> (keyword (link: ))
nil
user=> (keyword 1 1)
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

原因:关键字函数被定义为cond,对关键字、符号和字符串有三种情况。 There is no :else所以所有其他情况都返回nil。同样适用于find-keyword,它应该以同样的方式运行。

建议:我在cond中添加了一个:else分支,并抛出一个IllegalArgumentException,其中包含指示可接受类型的消息,并打印实际参数。我还在find-keyword中进行了相同的修改。还有一些简单的测试。

替代性方案:考虑在二参数情况中添加检查,但担心添加额外的开销不值得,因为它已经抛出了异常。在单参数情况下,因为没有显著的开销(它只会影响错误输入),没有添加额外开销。

补丁:keyword-1341-2014-02-12.2.patch

注意:此更改检查不了所有有误的输入,只检查类型。例如,依然可以传递包含“非法”关键字字符的字符串。

0
by
参考:https://clojure.atlassian.net/browse/CLJ-1341(由alexmiller报告)
...