2013-02-19 15 views
7

何度も何らかの関数を書くときに例外が発生します。それは正常です。 Javaでは、例外が発生する場所と理由を見つけることができますが、clojure例外テキストでは私は狂ってしまいます。いくつかのヒントは、例外をクロージャーで読み取る方法と、コード例外がどこで発生するのか、その理由を見つける方法はありますか?例えばREPLでclojure例外を読み取る方法は?

私はいくつかのコードを取る:私はREPLでこの関数を呼び出すとき

(do 
(list?) 
(list? []) 
(list? '(1 2 3)) 
(list? (defn f [] (do()))) 
(list? "a")) 

私は、2行目に問題を見つけるために、多くの私を助けていない

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: core$list-QMARK- (NO_SOURCE_FILE:46) 

を取得します。もう少し複雑なコードではほとんど情報が得られません。 (もちろん、それはリストを見ていますが、いくつかは引数の数が間違っています)REPLにコードを記述しようとするのは間違っていますか? REPLで例外メッシュを読み取るには? REPLの例外に関するより良い情報を得る方法はありますか?

+0

http://stackoverflow.com/questions/2352020/debugging-in-clojureの可能な複製。 –

+0

また、http://stackoverflow.com/questions/14297079/why-are-clojure-stacktraces-so-long/14298576#14298576に関連する – JohnJ

答えて

2

獲得org.clojure/tools.trace

user=> (use 'clojure.tools.trace) 

のは、(物事をより面白くするためにアップ変更)dotraceを試してみましょう:

user=> (dotrace [list?] 
    #_=> (do 
    #_=> (list? []) 
    #_=> (list? '(1 2 3)) 
    #_=> (list?) 
    #_=> (list? (defn f [] (do()))) 
    #_=> (list? "a")) 
    #_=>) 
IllegalStateException Can't dynamically bind non-dynamic var: clojure.core/list? 
    clojure.lang.Var.pushThreadBindings (Var.java:353) 

うーん...

user=> (.setDynamiC#'list?) 
#'clojure.core/list? 

さんは再びそれを試してみましょう:

user=> (dotrace [list?] 
    #_=> (do 
    #_=> (list? []) 
    #_=> (list? '(1 2 3)) 
    #_=> (list?) 
    #_=> (list? (defn f [] (do()))) 
    #_=> (list? "a"))) 
TRACE t1216: (list? []) 
TRACE t1216: => false 
TRACE t1217: (list? (1 2 3)) 
TRACE t1217: => true 
TRACE t1218: (list?) 
ArityException Wrong number of args (0) passed to: core$list-QMARK- 
    clojure.lang.AFn.throwArity (AFn.java:437) 

Aha!例外の前に(list?)にしました。

6

あなたはclojure.stacktraceを使用することができます:http://richhickey.github.com/clojure/clojure.stacktrace-api.html

使用法:

(use 'clojure.stacktrace) 
(/ 1 0) 
(e) 

出力:

java.lang.ArithmeticException: Divide by zero 
at clojure.lang.Numbers.divide (Numbers.java:156) 
    clojure.lang.Numbers.divide (Numbers.java:3691) 
    user$eval954.invoke (NO_SOURCE_FILE:1) 
    clojure.lang.Compiler.eval (Compiler.java:6511) 
    clojure.lang.Compiler.eval (Compiler.java:6477) 
    clojure.core$eval.invoke (core.clj:2797) 
    clojure.main$repl$read_eval_print__6405.invoke (main.clj:245) 
    clojure.main$repl$fn__6410.invoke (main.clj:266) 
nil 
関連する問題