很多次,当我尝试编写一些函数时,我得到了异常.这很正常.在Java中,您可以找到异常发生的地点和原因,但在clojure异常文本中只会让我发疯.是否有一些提示如何读取clojure中的异常以及如何查找代码异常发生的位置以及原因?
例如,我将采取一些代码:
(do
(list?)
(list? [])
(list? '(1 2 3))
(list? (defn f [] (do ())))
(list? "a"))
Run Code Online (Sandbox Code Playgroud)
当我在REPL中调用此函数时,我会得到
java.lang.IllegalArgumentException: Wrong number of args (0) passed to: core$list-QMARK- (NO_SOURCE_FILE:46)
Run Code Online (Sandbox Code Playgroud)
哪个在二线找不到问题对我帮助不大.在更复杂的代码中,它几乎不会提供任何信息.(当然它会告诉我看一下列表?有些参数错误.)我尝试在REPL中编写代码是不对的?如何在REPL中读取异常消息?有没有办法如何在REPL中获得有关异常的更好信息?
您可以使用clojure.stacktrace:http://richhickey.github.com/clojure/clojure.stacktrace-api.html
用法:
(use 'clojure.stacktrace)
(/ 1 0)
(e)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
user=> (use 'clojure.tools.trace)
Run Code Online (Sandbox Code Playgroud)
让我们尝试一下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)
Run Code Online (Sandbox Code Playgroud)
唔...
user=> (.setDynamic #'list?)
#'clojure.core/list?
Run Code Online (Sandbox Code Playgroud)
让我们再试一次:
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)
Run Code Online (Sandbox Code Playgroud)
啊哈!做到了(list?)异常之前。
| 归档时间: |
|
| 查看次数: |
652 次 |
| 最近记录: |