2013-06-26 15 views
10

私はClojureを使用していますが、私はログインできるスタックトレースに手を入れたい(理想的には、Stringとして取得したいと思います)。stacktraceを文字列として取得する

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

ありがとうございました。

答えて

16

number23_cnのソリューションは少しくらいであれば、これはあなたがして印刷することができた(文字列として.getStackTraceの結果を使用する方法であります、ログに入れてください)

​​
8

使用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#] 
     [email protected] 
     (str s#)))) 

(try 
    (/ 1 0) 
    (catch Exception e 
    (let [s (with-err-str (pst e 36))] 
     (println "Error log:") 
     (println s)))) 
+0

作品を使用することができます。ちょうど私は最初のステートメントを変更するのは嫌だった([clojure.repl:only(pst)]を使う) – sebi

5

ノイズスミスの回答よりも若干改善されています。それは怠惰な配列を残し、美化機能を持っていません。

(apply str (interpose "\n" (.getStackTrace t))) 
0

print-stack-traceprint-trace-elementおよび他のいくつかの有用な機能を備えていclojure.stacktraceもあります。

0

あなたは魅力のようなwith-out-str

(try 
    (name nil) 
    (catch Exception e 
    (with-out-str (println e)))) 
関連する問題