clojure - 如何用clojure做一个简单的try/catch?

标签 clojure try-catch

以下两个代码段均不适用于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/

相关文章:

ruby - 你会如何用 Ruby 和/或 Haskell 编写这个 Clojure 片段?

clojure - 为什么要在记录中实现功能?

python - Python 中的 try-else 有什么用?

android - 当您的应用程序代码中有 try-catch 时,Robolectric 测试中的错误上升

PHP 捕获 undefined variable 错误

concurrency - clojure ref 的奇怪行为

macros - 使用 clojure 宏在 reify 调用中自动创建 getter 和 setter

clojure - leiningen安装lein-noir失败

函数或类中的 Swift try-catch 处理

erlang - 如何在Erlang中进行尝试/捕获