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

评论由:alexmiller 发布

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

对于2个参数的修改,我有一些顾虑 - 我担心我们正在将新检查添加到一个相当热的代码路径(关键字创建)中。2个参数的路径不会静默失败,你会得到一个ClassCastException,所以我认为在这些地方添加这些检查不值得。在1参数的情况下,你已经通过了else,所以没有额外的成本。

0

由:ericnormand 评论

我明白了。我将移除两个参数的情况。

0

由: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,有多种情况用于关键字、符号和字符串。没有:else,所以所有其他情况都返回nil。find-keyword也是这样,它应该以相同的方式行事。

建议:我在 cond 中添加了 :else 分支,并抛出 IllegalArgumentException,该异常包含指示可接受类型和打印实际参数的消息。我也对 find-keyword 做了同样的修改。还有简单的测试。

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

Patch: keyword-1341-2014-02-12.2.patch

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

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