2010-10-31 15 views
19

में कॉलस्टैक प्राप्त करें जब मैं अपना क्लोजर प्रोग्राम चलाता हूं और निष्पादन के दौरान त्रुटि प्राप्त करता हूं, तो मुझे लगता है कि आरईपीएल द्वारा मुद्रित संदेश में केवल स्क्रिप्ट द्वारा शीर्ष स्तर की लाइन संख्या शामिल है। क्या मैं इसे कॉल स्टैक डंप करने के लिए प्राप्त कर सकता हूं (जो क्लोजर कोड की विभिन्न पंक्ति संख्याओं का संदर्भ देता है)?क्लोजर

उदाहरण के लिए:

user=> (load-file "test.clj") 
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval134$fn (test.clj:206) 
user=> 

अगर मैं सिर्फ शीर्ष स्तर कॉल (लाइन 206) की तुलना में अधिक पता था कि यह अच्छा होगा।

उत्तर

28

अंतिम अपवाद फेंक दिया गया *e var में उपलब्ध है। आप अपवाद पर .printStackTrace पर कॉल करके एक स्टैक ट्रेस प्रिंट कर सकते हैं। यदि आपकी अपवाद फ़ाइल में स्रोत कोड द्वारा फेंक दिया गया है, या NO_SOURCE_FILE यदि यह आरईपीएल से है, तो नीचे दिए गए मेरे उदाहरणों में यह लाइन नंबर प्रिंट करेगा।

Clojure 1.2.0 
user=> (throw (Exception. "FOO")) 
java.lang.Exception: FOO (NO_SOURCE_FILE:0) 
user=> *e 
#<CompilerException java.lang.Exception: FOO (NO_SOURCE_FILE:0)> 
user=> (.printStackTrace *e) 
java.lang.Exception: FOO (NO_SOURCE_FILE:0) 
     at clojure.lang.Compiler.eval(Compiler.java:5440) 
     at clojure.lang.Compiler.eval(Compiler.java:5391) 
     at clojure.core$eval.invoke(core.clj:2382) 
     at clojure.main$repl$read_eval_print__5624.invoke(main.clj:183) 
     at clojure.main$repl$fn__5629.invoke(main.clj:204) 
     at clojure.main$repl.doInvoke(main.clj:204) 
     at clojure.lang.RestFn.invoke(RestFn.java:422) 
     at clojure.main$repl_opt.invoke(main.clj:262) 
     at clojure.main$main.doInvoke(main.clj:355) 
     at clojure.lang.RestFn.invoke(RestFn.java:398) 
     at clojure.lang.Var.invoke(Var.java:361) 
     at clojure.lang.AFn.applyToHelper(AFn.java:159) 
     at clojure.lang.Var.applyTo(Var.java:482) 
     at clojure.main.main(main.java:37) 
Caused by: java.lang.Exception: FOO 
     at user$eval1.invoke(NO_SOURCE_FILE:1) 
     at clojure.lang.Compiler.eval(Compiler.java:5424) 
     ... 13 more 
nil 

Clojure 1.3 (अल्फा) में एक समारोह pst वही चीज़ बुलाया नहीं है। ये ढेर निशान थोड़े अच्छे हैं क्योंकि कुछ बाहरी रेखाएं हटा दी जाती हैं।

Clojure 1.3.0-master-SNAPSHOT 
user=> (throw (Exception. "FOO")) 
Exception FOO user/eval1 (NO_SOURCE_FILE:1) 
user=> (pst) 
Exception FOO 
     user/eval1 (NO_SOURCE_FILE:1) 
     clojure.lang.Compiler.eval (Compiler.java:5998) 
     clojure.lang.Compiler.eval (Compiler.java:5965) 
     clojure.core/eval (core.clj:2652) 
     clojure.core/eval (core.clj:-1) 
     clojure.main/repl/read-eval-print--5575 (main.clj:178) 
     clojure.main/repl/fn--5580 (main.clj:199) 
     clojure.main/repl (main.clj:199) 
     clojure.main/repl-opt (main.clj:257) 
     clojure.main/main (main.clj:350) 
     clojure.lang.Var.invoke (Var.java:361) 
     clojure.lang.Var.applyTo (Var.java:482) 
nil 

कुछ आईडीई (जैसे Emacs के लिए SLIME) स्वचालित रूप से आपके लिए स्टैक ट्रेस पॉप अप करेंगे। clojure.stacktrace और clj-stacktrace जैसे स्टैकट्रैक्स को प्रदर्शित करने और छेड़छाड़ करने के लिए कुछ पुस्तकालय भी हैं।

स्टैक ट्रेस हैंडलिंग क्लोजर का एक पहलू प्रतीत होता है जिसे अभी भी परिष्कृत किया जा रहा है।

+0

पूरी तरह से काम करता है! :) – pauldoo

+0

* ई के अलावा पिछले अपवादों तक पहुंचने का कोई तरीका है? – mascip