7

関数を記述しようとすると、何度も例外が発生します。それは正常です。Java では、例外が発生する場所と理由を見つけることができますが、clojure の例外テキストは私を夢中にさせます。clojure で例外を読み取る方法と、コードのどこで例外が発生し、その理由を見つける方法についてのヒントはありますか?

たとえば、次のコードを使用します。

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

REPLでこの関数を呼び出すと、取得されます

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

2行目で問題を見つけるのにあまり役に立ちません。もう少し複雑なコードでは、ほとんど情報が得られません。(もちろん、リストを見てください。引数の数が間違っている場合もあります。) REPL でコードを書こうとするのは間違っていますか? REPLで例外メッセージを読む方法は? REPL の例外に関するより良い情報を取得する方法はありますか?

4

2 に答える 2

6

使用できますclojure.stacktracehttp://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
于 2013-02-19T10:19:56.467 に答える
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)

あはは!(list?)例外の前にそれをしました。

于 2013-02-19T14:04:39.530 に答える