如果我定义以下功能
(defn catcher [x] (try
(load-string x)
(catch Exception e
(prn "caught"))) )
(catcher "(+ 2 \"2\")")
=>“抓到”
但是(catcher "(keys [1 2])")
=> ClassCastException java.lang.Long无法强制转换为java.util.Map $ Entry
通常,这两个输入都抛出ClassCastException,那么为什么只捕获第一个?
尝试打印的结果时,似乎发生了异常(keys [1 2])
。
(type (catcher "(keys [1 2])"))
=> clojure.lang.APersistentMap$KeySeq
在这里,您可以看到表达式实际上是在创建/返回aKeySeq
而不会引发/捕获异常。只有当这KeySeq
是印刷的异常被抛出:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map$Entry
at clojure.lang.APersistentMap$KeySeq.first(APersistentMap.java:168)
at clojure.lang.RT.first(RT.java:685)
at clojure.core$first__5107.invokeStatic(core.clj:55)
at clojure.core$print_sequential.invokeStatic(core_print.clj:64)
at clojure.core$fn__7021.invokeStatic(core_print.clj:174)
at clojure.core$fn__7021.invoke(core_print.clj:174)
at clojure.lang.MultiFn.invoke(MultiFn.java:233)
at clojure.tools.nrepl.middleware.pr_values$pr_values$fn$reify__784.send(pr_values.clj:35)
注意,在堆栈跟踪中,当REPL尝试实现打印顺序时,此异常源自KeySeq.first
方法(直到您的函数创建并返回其值之后才调用该异常)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句