error-handling - 如何访问:cause, :via and :trace keys of an exception in Clojure?

标签 error-handling clojure functional-programming lisp clojurescript

我找不到访问异常的 :cause、:via 和 :trace 键的方法。

代码如下:

(try
  (throw (IllegalArgumentException. "1"))
  (catch Exception e
    e))

输出:

#error{:cause "1",
       :via [{:type java.lang.IllegalArgumentException, :message "1", :at [user$eval4073 invokeStatic "form-init5592296091748814678.clj" 1]}],
       :trace [[user$eval4073 invokeStatic "form-init5592296091748814678.clj" 1]
               [user$eval4073 invoke "form-init5592296091748814678.clj" 1]
               [clojure.lang.Compiler eval "Compiler.java" 6927]
               [clojure.lang.Compiler eval "Compiler.java" 6890]
               [clojure.core$eval invokeStatic "core.clj" 3105]
               [clojure.core$eval invoke "core.clj" 3101]
               [clojure.main$repl$read_eval_print__7408$fn__7411 invoke "main.clj" 240]
               ....]}

附言:(:via e) 不起作用。

最佳答案

当发生异常时,Clojure(JVM)会抛出一个 Java Exception 对象。 Clojure 使用函数 Throwable->map 将其转换为数据,然后为您打印。您可以自己调用该函数:

user=> (try (throw (Exception. "BOOM!")) 
         (catch Exception e 
           (Throwable->map e)))

{:cause "BOOM!",
 :via [{:type java.lang.Exception,
        :message "BOOM!",
        :at [user$eval1 invokeStatic "NO_SOURCE_FILE" 1]}],
 :trace [[user$eval1 invokeStatic "NO_SOURCE_FILE" 1] 
         ...]}

然后您可以对返回的数据使用普通关键字访问器:

user=> (println (:cause *1) (first (:via *1)))
BOOM! {:type java.lang.Exception, :message BOOM!, :at [user$eval7 invokeStatic NO_SOURCE_FILE 4]}

关于error-handling - 如何访问:cause, :via and :trace keys of an exception in Clojure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42011187/

相关文章:

codeigniter - 我在codeigniter中使用resize()库时出错

java - 如何以编程方式调用 Maven 任务

java - 在 Java 对象树上创建的 Clojure zipper 可以在 zip-filter 中工作吗?

Clojure 中的宏、评估和引用

parsing - 在F#中解析时如何处理错误

asp.net - ASP.NET –数据库存储过程中的错误处理

javascript - 在 jQuery 的 Deferred 对象中抛出错误

.net - F# 的 int 中的 get_Zero 是什么/在哪里?

c# - Linq 查询性能,比较编译查询与非编译查询

algorithm - 用于查找范围的可变变量 Racket