繁体   English   中英

如何阅读REPL中的clojure异常?

[英]How to read clojure exceptions in REPL?

很多次,当我尝试编写一些函数时,我得到了异常。 这很正常。 在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)

哪个在二线找不到问题对我帮助不大。 在更复杂的代码中,它几乎不会提供任何信息。 (当然它告诉我看一下列表?有些参数错误。)我尝试在REPL中编写代码是不对的? 如何在REPL中读取异常消息? 有没有办法如何在REPL中获得有关异常的更好信息?

你可以使用clojure.stacktracehttp: clojure.stacktrace

用法:

(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

获取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?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM