13

私は Clojure を使用しており、ログに記録できるスタック トレースを取得したいと考えています (理想的には、文字列として取得したいと考えています)。

それが aを(.getStackTrace e)返すのはわかりますStackTraceElement[]が、そこから意味のあるものを出力する方法がわかりません。私の 2 番目のアプローチは(.printStackTrace e)、パラメーターとして PrintWriter を使用することでした (Java でこれが可能であることを知っているため) が、正しい構文が得られないようです。

ありがとう。

4

6 に答える 6

20

number23_cn の解決策が少し多すぎる場合、これは .getStackTrace の結果を文字列として使用する方法です (出力したり、ログに記録したりできます)。

(try (/ 1 0)
  (catch Throwable t
    (map str (.getStackTrace t))))
于 2013-06-27T00:59:21.987 に答える
8

get StackTrace を使用し、次clojure.repl.pstのようにバインド*err*java.io.StringWriterます。

(use '[clojure.repl :only (pst)])

(defmacro with-err-str
  "Evaluates exprs in a context in which *err* is bound to a fresh
  StringWriter.  Returns the string created by any nested printing
  calls."
  [& body]
  `(let [s# (new java.io.StringWriter)]
     (binding [*err* s#]
       ~@body
       (str s#))))

(try
  (/ 1 0)
  (catch Exception e
    (let [s (with-err-str (pst e 36))]
      (println "Error log:")
      (println s))))
于 2013-06-26T07:55:59.947 に答える