【问题标题】:How should I json encode an exception in clojure?我应该如何在 clojure 中对异常进行 json 编码?
【发布时间】:2018-09-02 09:55:03
【问题描述】:

我希望能够对异常对象进行 json 编码。我正在将我的日志推送到 sumologic,并希望能够推送 json 编码的异常,以便我也可以在 sumo 中解析和过滤这些日志。

但是,我不能对异常进行 json 编码并得到这个错误:

Cannot JSON encode object of class: class java.lang.Class: class clojure.lang.ExceptionInfo

这是我的 compojure-api 异常处理程序:

(defn exception-handler
  "Handles exceptions."
  [f]

  (fn [^Exception ex data request]
    (log/error (json/generate-string {:request-id log-helper/*request-id*
                                      :error    ex}))

    (f (.getMessage ex))))

【问题讨论】:

    标签: clojure compojure-api sumologic


    【解决方案1】:

    应用程序在这方面会有不同的需求,但一种策略可以是使用Throwable->map

    (Throwable->map 
      (ex-info 
        "The Holy Grail me be found in the castle of-aaaaaaaaaaaaaaaarrrgh" 
        {:film "Monty Python and the Holy Grail (1975)"} 
        (IllegalStateException. "aaaaargh")))
    => 
    {:cause "aaaaargh",
     :via
     [{:type clojure.lang.ExceptionInfo,
       :message
       "The Holy Grail me be found in the castle of-aaaaaaaaaaaaaaaarrrgh",
       :data {:film "Monty Python and the Holy Grail (1975)"},
       :at [clojure.core$ex_info invokeStatic "core.clj" 4739]}
      {:type java.lang.IllegalStateException,
       :message "aaaaargh",
       :at [user$eval13 invokeStatic "NO_SOURCE_FILE" 2]}],
     :trace
     [[user$eval13 invokeStatic "NO_SOURCE_FILE" 2]
      [user$eval13 invoke "NO_SOURCE_FILE" 2]
      [clojure.lang.Compiler eval "Compiler.java" 7062]
      [clojure.lang.Compiler eval "Compiler.java" 7025]
      [clojure.core$eval invokeStatic "core.clj" 3206]
      [clojure.core$eval invoke "core.clj" 3202]
      [clojure.main$repl$read_eval_print__8572$fn__8575
       invoke
       "main.clj"
       243]
      [clojure.main$repl$read_eval_print__8572 invoke "main.clj" 243]
      [clojure.main$repl$fn__8581 invoke "main.clj" 261]
      [clojure.main$repl invokeStatic "main.clj" 261]
      [clojure.main$repl_opt invokeStatic "main.clj" 325]
      [clojure.main$main invokeStatic "main.clj" 424]
      [clojure.main$main doInvoke "main.clj" 387]
      [clojure.lang.RestFn invoke "RestFn.java" 397]
      [clojure.lang.AFn applyToHelper "AFn.java" 152]
      [clojure.lang.RestFn applyTo "RestFn.java" 132]
      [clojure.lang.Var applyTo "Var.java" 702]
      [clojure.main main "main.java" 37]]}
    

    如果您想对异常进行自定义数据表示,我建议您查看source of Throwable->map 以了解如何获取相关信息。

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 2013-11-12
      • 2011-09-30
      • 2017-05-12
      • 2017-01-29
      • 2012-09-14
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      相关资源
      最近更新 更多