簡體   English   中英

為什么printStackTrace不能在Clojure中運行?

[英]Why doesn't printStackTrace work in Clojure?

在歡樂Clojure和Alex Miller的Pure Danger Tech博客文章中 ,建議您使用以下內容打印最后一個堆棧:

(use 'clojure.stacktrace) 
(java.util.Date. "foo")
(.printStackTrace *e 5)

但我不能讓他們的任何一個例子起作用,而只是得到

java.lang.NullPointerException: null
        Reflector.java:26 clojure.lang.Reflector.invokeInstanceMethod
         (Unknown Source) jtown$eval9755.invoke

怎么了? .printStackTrace看起來似乎是一個Java函數,所以我不知道為什么我首先將clojure.stacktrace帶入我的命名空間。 我讀了一下clojure.stacktrace API,然后看到一個e函數,它看起來也很相似但不是* e函數,它在核心中並且應該綁定到最后一個異常,但事實並非如此。 有人可以用最好的方法來檢查堆棧痕跡嗎?

使用REPL時可以使用一些特殊的變量

* e - 保存最后一個異常的結果。

例如:

core=> (java.util.Date. "foo")
IllegalArgumentException   java.util.Date.parse (Date.java:615)


core=> (class *e)
java.lang.IllegalArgumentException


core=> (.printStackTrace *e)
java.lang.IllegalArgumentException
    at java.util.Date.parse(Date.java:615)
        <not included.....>

你是對的.printStackTrace是在異常類上調用的java方法。 這不是很簡單(因為它的java互操作)所以clojure.stacktrace命名空間有一些關於使用堆棧跟蹤的實用程序

所以之后

(use 'clojure.stacktrace)

你可以使用stacktrace庫而不是java interop:

core=> (print-stack-trace *e)
java.lang.IllegalArgumentException: null
 at java.util.Date.parse (Date.java:615)
 <not included.....>

顯然,在應用程序中,您可以嘗試捕獲並根據需要使用相關功能,而不是* e

我用

(.printStackTrace *e *out*)

這似乎有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM