2012-09-29 16 views
14

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

मैंने पकड़ फ़ॉर्म में शून्य, जेएस/त्रुटि, जेएस/ऑब्जेक्ट का उपयोग करने की कोशिश की और यह किसी भी जावास्क्रिप्ट अपवाद को पकड़ नहीं लेता है (जिसमें ऑब्जेक्ट के प्रकार के रूप में स्ट्रिंग हो सकती है)।

मैं किसी भी संकेत की सराहना करता हूं कि यह क्लोजरस्क्रिप्ट में मूल रूप से कैसे किया जा सकता है।

+0

हाय दीमा में एक और संभावित जवाब मिला ! क्या आपको लगता है कि मेरी प्रतिक्रिया आपकी समस्या को ठीक करती है? – tangrammer

उत्तर

5

यह js की तरह दिखता है/वस्तु उन सब को पकड़ता (https://himera.herokuapp.com पर परीक्षण): बाहर देखने के लिए

cljs.user> (try (throw (js/Error. "some error")) (catch js/Object e (str "Caught: " e))) 
"Caught: Error: some error" 
cljs.user> (try (throw "string error") (catch js/Object e (str "Caught: " e))) 
"Caught: string error" 
cljs.user> (try (js/eval "throw 'js error';") (catch js/Object e (str "Caught: " e))) 
"Caught: js error" 

एक बात आलसी दृश्यों है। यदि आलसी अनुक्रम में कोई त्रुटि फेंक दी जाती है तो कोड का हिस्सा तब तक निष्पादित नहीं किया जा सकता जब तक कि आप कोशिश करने से बाहर नहीं निकलते। उदाहरण के लिए:

cljs.user> (try (map #(if (zero? %) (throw "some error")) [1])) 
(nil) 
cljs.user> (try (map #(if (zero? %) (throw "some error")) [0])) 
; script fails with "Uncaught some error" 

उस अंतिम मामले में, नक्शा एक आलसी अनुक्रम बनाता है और प्रयास फ़ंक्शन इसे वापस कर देता है। फिर, जब प्रतिलिपि कंसोल के अनुक्रम को मुद्रित करने का प्रयास करती है, तो इसका मूल्यांकन किया जाता है और त्रुटि अभिव्यक्ति के बाहर त्रुटि फेंक दी जाती है।

+0

आप उन्हें 'डिफ़ॉल्ट' के साथ भी पकड़ सकते हैं, जो शायद अधिक मूर्खतापूर्ण है – olieidel

3

मुझे लगता है कि मैं सिर्फ इस लिंक https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU

मैं यहाँ सामग्री की प्रतिलिपि में समाधान मिल गया है: यह समाधान Herwig Hochleitner द्वारा प्रकाशित किया गया

clojurescript में कोशिश वास्तव में एक मैक्रो है कि बिल्टिन प्रयास * का उपयोग करता है और प्रकार प्रेषण जोड़ता है। तो सब कुछ पकड़ने के लिए, बस उपयोग करें (कोशिश करें ... (पकड़ो ई ...))। यह सीधे जावास्क्रिप्ट की कोशिश के लिए नक्शे।

और यहाँ मेरी कार्यान्वयन अब काम कर रहा है:

(defn is-dir? [the_dir] 
    (try* 
    (if-let [stat (.statSync fs the_dir)] 
     (.isDirectory stat) 
     false) 
    (catch e 
     (println "catching all exceptions, include js/exeptions") 
     false 
    ) 
    ) 
) 

मुझे आशा है कि यह आप
जुआन

+0

प्रयास * अब बहिष्कृत है। का प्रयोग करें: आपके अन्य उत्तर – johnbakers

33

में मदद करता है मैं दाऊद Nolen "Light Table ClojureScript Tutorial"

;; Error Handling 
;; ============================================================================ 

;; Error handling in ClojureScript is relatively straightforward and more or 
;; less similar to what is offered in JavaScript. 

;; You can construct an error like this. 

(js/Error. "Oops") 

;; You can throw an error like this. 

(throw (js/Error. "Oops")) 

;; You can catch an error like this. 

(try 
    (throw (js/Error. "Oops")) 
    (catch js/Error e 
    e)) 

;; JavaScript unfortunately allows you to throw anything. You can handle 
;; this in ClojureScript with the following. 

(try 
    (throw (js/Error. "Oops")) 
    (catch :default e 
    e)) 
+0

में डिफ़ॉल्ट यह अब करने का उचित तरीका है। – johnbakers

+0

': डिफ़ॉल्ट 'वर्तमान में" नियमित "(जावा-आधारित) क्लोजर में मौजूद नहीं है, लेकिन इसमें इसे जोड़ने का एक प्रस्ताव भी है: http://dev.clojure.org/jira/browse/CLJ-1293 –

संबंधित मुद्दे