2012-09-29 17 views
14

İletişim katmanımda HER javascript istisnasını yakalayabilmem gerekiyor, oturum açın ve normalde yaptığım gibi devam edin. Clojurescript'teki özel durumları yakalamak için geçerli sözdizimi, yakalanmakta olan özel durumun türünü belirtmem gerektiğini belirtir.Clojurescript'te herhangi bir Javascript istisnası nasıl yakalanır?

Yakalama formunda nil, js/Error, js/object kullanmayı denedim ve ANJ javascript istisnasını yakalamıyor (nesnenin türü olarak dizeye sahip olabilir).

Bunun, Clojurescript'te yerel olarak nasıl yapılabileceğine dair tüm ipuçlarını takdir ediyorum.

+0

Merhaba Dima başka olası cevabını buldu size
Juan – tangrammer

cevap

5

O Nesne (https://himera.herokuapp.com üzerinde test) hepsini yakalar/js gibi görünüyor:

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" 

bir şey tembel diziler olduğu için dikkat etmek. Tembel bir sıraya bir hata atılırsa, kodun bir parçası, try fonksiyonundan çıkana kadar çalıştırılamayabilir. Örneğin: Bu son durumda

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" 

, harita tembel diziyi oluşturur ve deneyin işlevi döndürür. Ardından, repl diziyi konsola yazdırmaya çalıştığında değerlendirilir ve hata, try ifadesinin dışına atılır.

+0

onları ': default' ile yakalayabilirsin, bu muhtemelen daha idiomatic olan – olieidel

3

Ben sadece bu bağlantı https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU

Burada içeriği kopyalamak çözümü buldum: clojurescript içinde Bu çözüm Herwig Hochleitner tarafından yayımlandı

deneyin aslında bir makro olduğunu builtin try * kullanır ve yazım ekler. Yani her şeyi yakalamak için, sadece kullanın (deneyin * ... (catch e ...)). Bu doğrudan javascript'in denemesiyle eşleşir. Burada

Ve

benim uygulaması şimdi çalışıyor:

(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 
    ) 
    ) 
) 

Ben David 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

try * şimdi kullanımdan kaldırılmıştır. Kullanın: varsayılan diğer cevabınızdeki gibi – johnbakers

33

yardımcı olur umarım ! Cevabım sorununuzu düzeltti mi?
+0

Bu şimdi bunu yapmak için uygun bir yoldur. – johnbakers

+0

': default' şu anda" normal "(Java tabanlı) Clojure'da mevcut değil, buna ek olarak bir öneri de var: http://dev.clojure.org/jira/browse/CLJ-1293 –

İlgili konular