你可以抓住
ArityException
在某些情况下,会出现问题;取决于上下文和导致
.
我马上就要承认,我在推测一些方面,因为我以前从来没有深入探讨过这个问题。
首先,看看如果你打电话会发生什么
inc
在提供的参数数量明显错误的情况下:
(inc)
CompilerException clojure.lang.ArityException: Wrong number of args (0) passed to: core/inc--inliner--4489, compiling: . . .
有趣的是
inc--inliner--4489
. 如果你看一下
,它附带了以下元数据:
:inline (fn [x] `(. clojure.lang.Numbers (~(if *unchecked-math* 'unchecked_inc 'inc) ~x)))
我从没调查过
:inline
我以前一直认为这意味着它将尝试内联调用以(略微)减少开销。在这种情况下,它试图内联
股份有限公司
只是一个电话
clojure.lang.Numbers/inc
clojure.lang.Numbers/unchecked_inc
*unchecked-math*
. 还要注意错误是如何开始的:
CompilerException clojure.lang.ArityException
(inc)
编译时间
(公司)
(公司)
永远都不可能正确,所以无论如何都没有必要抓住它。
可以
*
). 说你不允许打电话给
股份有限公司
正如@Rulle所建议的,
apply
反驳论点:
(try
(apply inc [])
(catch clojure.lang.ArityException e
(println "Caught!")))
Caught!
编译器不能确定是否
股份有限公司
应用
算术异常
:内联
在等式之外,你还可以看到你的一个自定义函数可以有它自己的
因为调用不是内联的,所以在编译时不会失败,所以不那么麻烦:
(defn hello [arg])
(try
(hello) ; No apply
(catch clojure.lang.ArityException e
(println "Caught!")))
Caught!
*
我不能说我曾经有过
算术异常
应用
,这将更有意义,以验证论点提前,甚至重新考虑你的使用
应用
应用
导致
算术异常
,你可能在逻辑上有一个缺陷
try