14

In meiner Kommunikationsebene muss ich in der Lage sein, JEDE JavaScript-Ausnahme zu erfassen, sie zu protokollieren und fortzufahren, wie es normalerweise der Fall wäre. Die aktuelle Syntax für das Abfangen von Ausnahmen in Clojurescript schreibt vor, dass ich den Typ der Ausnahme angeben muss, die abgefangen wird.Wie kann man eine JavaScript-Ausnahme in Clojurescript abfangen?

Ich habe versucht, nil, js/Error, js/object in der Fangform und es fängt keine Javascript-Ausnahme (die Zeichenfolge als der Typ des Objekts haben kann).

Ich würde mich über Hinweise freuen, wie dies nativ in Clojurescript getan werden kann.

+0

Hallo Dima eine weitere mögliche Antwort in David Nolen gefunden ! Denkst du, meine Antwort löst dein Problem? – tangrammer

Antwort

5

Es sieht aus wie js/Objekt fängt sie alle (getestet auf 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" 

Eine Sache für faule Sequenzen zu achten ist. Wenn ein Fehler in einer verzögerten Sequenz ausgelöst wird, wird dieser Teil des Codes möglicherweise erst nach dem Beenden der try-Funktion ausgeführt. Zum Beispiel:

In diesem letzten Fall erstellt Karte eine Lazy-Sequenz und die Try-Funktion gibt es zurück. Wenn dann der Repl versucht, die Sequenz auf die Konsole zu drucken, wird sie ausgewertet und der Fehler wird außerhalb des try-Ausdrucks ausgegeben.

+0

Sie können sie auch mit ': default' fangen, was wahrscheinlich idiomatischer ist – olieidel

3

Ich glaube, ich habe gerade die Lösung in diesem Link https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU

ich die Inhalte hier kopieren gefunden: Diese Lösung von Herwig Hochleitner

Versuch in clojurescript veröffentlicht wurde, ist eigentlich ein Makro, das verwendet den eingebauten try * und fügt den Typ Versand hinzu. Um alles zu fangen, benutzen Sie einfach (versuchen * ... (fangen e ...)). Dies entspricht direkt dem Versuch von javascript.

Und hier arbeitet meine Implementierung jetzt:

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

Ich hoffe, dass es Sie
Juan

+0

try * ist jetzt veraltet. Verwenden Sie das: default wie in Ihrer anderen Antwort – johnbakers

33

I hilft "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

Dies ist jetzt der richtige Weg, um es zu tun. – johnbakers

+0

': default' existiert zur Zeit nicht in" normalen "(Java-basierten) Clojure, aber es gibt auch einen Vorschlag, es hinzuzufügen: http://dev.clojure.org/jira/browse/CLJ-1293 –

Verwandte Themen