代码之家  ›  专栏  ›  技术社区  ›  Dennis Hackethal

如何在Clojure中捕获arity异常?

  •  2
  • Dennis Hackethal  · 技术社区  · 7 年前

    我试图捕捉这样一个arity异常:

    (try
      (inc)
      (catch clojure.lang.ArityException e
        (str "caught exception: " (.getMessage e))))))
    

    在这种情况下,我调用 inc

    (try
      (inc)
      (catch clojure.lang.ArityException e
        (str "caught exception: " (.getMessage e))))))
    
    ; => CompilerException clojure.lang.ArityException: Wrong number of args (0) passed to: core/inc--inliner--4489
    

    试图抓住任何 Exception 一般代替 clojure.lang.ArityException 还是扔。

    我相信任何在Clojure开发方面经验丰富的人都会立刻发现我的错误。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Carcigenicate    7 年前

    你可以抓住 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

    推荐文章