以下两个代码段均不适用于Clojure 1.6.0
(try
(prn vv)
(catch clojure.lang.ExceptionInfo e (prn "catch e: " e))
(finally (prn "finally") )
)
在阅读以下其他文章后,我也尝试了此操作:
(try
(doall (prn vv))
(catch clojure.lang.ExceptionInfo e (prn "catch e: " e))
(finally (prn "finally") )
)
我想念什么?
麦克风
最佳答案
捕获ExceptionInfo将仅捕获用ex-info创建的可抛出对象:
(try
(throw (ex-info "bad" {:a 1 :b 2}))
(catch clojure.lang.ExceptionInfo e
(prn "caught" e)))
;; => "caught" #<ExceptionInfo clojure.lang.ExceptionInfo: bad {:b 2, :a 1}>
但其他异常(exception)除外:
(try
(/ 1 "0")
(catch clojure.lang.ExceptionInfo e
(prn "caught" e)))
;; => ClassCastException java.lang.String cannot be cast to java.lang.Number clojure.lang.Numbers.divide (Numbers.java:155)
您会这样捕获:
(try
(/ 1 "0")
(catch Exception e
(prn "caught" e)))
;; => "caught" #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number>
编译异常发生在评估之前:
(try
w is undefined
(catch Exception e
(prn "caught" e)))
;; => CompilerException java.lang.RuntimeException: Unable to resolve symbol: w in this context, compiling:(/private/var/folders/8r/y2d3thln6s3fyrl_s6vknb440000gn/T/form-init6601588363347445596.clj:1:5)
(try
(eval 'w)
(catch Exception e
(prn "caught" e)))
;; => "caught" #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: w in this context, compiling:(/private/var/folders/8r/y2d3thln6s3fyrl_s6vknb440000gn/T/form-init6601588363347445596.clj:1:5)>
您还可以具有多个catch子句来处理不同类型的异常。
关于clojure - 如何用clojure做一个简单的try/catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211457/