2013-02-19 36 views
7

कई बार जब मैं कुछ फ़ंक्शन लिखने का प्रयास करता हूं तो मुझे अपवाद मिलता है। यह सामान्य बात है। जावा में आप जगह और कारण ढूंढ सकते हैं क्यों अपवाद होता है लेकिन क्लोजर अपवाद ग्रंथों में बस मुझे पागल बनाते हैं। क्या कुछ सुझाव हैं कि क्लोजर में अपवाद कैसे पढ़ा जाए और कैसे पता लगाया जाए कि कोड अपवाद कहां होता है और क्यों?आरईपीएल में क्लोजर अपवाद कैसे पढ़ा जाए?

उदाहरण के लिए मैं कुछ कोड ले जाएगा:

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

जब मैं आरईपीएल में इस फ़ंक्शन को कॉल मैं

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

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

+0

http://stackoverflow.com/questions/2352020/debugging-in-clojure का संभावित डुप्लिकेट। –

+0

http://stackoverflow.com/questions/14297079/why-are-clojure-stacktraces-so-long/14298576#14298576 से भी संबंधित है – JohnJ

उत्तर

2

मोल org.clojure/tools.trace

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) 

user=> (use 'clojure.tools.trace) 

के एक dotrace (चीजें अधिक दिलचस्प बनाने के आदेश को बदल) कोशिश करते हैं

आह! अपवाद से पहले इसे (list?) पर बनाया गया।

6

आप clojure.stacktrace उपयोग कर सकते हैं: http://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