14

내 통신 레이어에서 나는 모든 자바 스크립트 예외를 잡아낼 수 있어야하고, 정상적으로 로그 할 때 로그하고 계속 진행해야합니다. Clojurescript에서 예외를 잡기위한 현재 구문은 잡히는 예외의 유형을 지정해야한다고 지시합니다.Clojurescript에서 Javascript 예외를 잡는 방법?

캐치 폼에서 nil, js/Error, js/object를 사용하려고했는데 어떤 자바 스크립트 예외 (객체의 유형으로 문자열을 가질 수 있음)를 잡아 내지 못했습니다.

Clojurescript에서이 작업을 기본적으로 수행 할 수있는 방법에 대해 알고 싶습니다.

+0

안녕 디마에서 또 다른 가능한 답을 발견하면
후안 – tangrammer

답변

5

그것은 개체 (https://himera.herokuapp.com 테스트) 그들 모두를 잡는다/JS 같습니다

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" 

것은 게으른 시퀀스입니다 조심. 게으른 시퀀스에서 오류가 발생하면 try 함수를 종료 할 때까지 코드의 일부가 실행되지 않을 수 있습니다. 예를 들면 다음과 같습니다.

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" 

마지막 경우 map은 지연 시퀀스를 만들고 try 함수는이를 반환합니다. 그런 다음 repl 명령이 콘솔에 시퀀스를 인쇄하려고하면 오류가 평가되고 try 식 외부에서 오류가 발생합니다.

+0

당신은': default'로 그것들을 잡을 수 있습니다. 아마 더 관용적 일 것입니다. – olieidel

3

는 난 그냥이 링크 https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU

내가 여기에 내용을 복사에서 솔루션을 찾은 것 같아 : clojurescript에서 이 솔루션은 HERWIG Hochleitner에 의해 출판되었다 ​​

시도가 실제로 매크로입니다 내장 * try * 을 사용하고 유형 디스패치를 ​​추가합니다. 그래서 모든 걸 잡으려고, 그냥 (시도 * ... (잡아 전자 ...)). 이것은 javascript의 try에 직접 매핑됩니다. 여기

그리고

내 구현은 지금 노력하고 있습니다 :

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

나는 그것이 내가 다윗 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 *는 이제 더 이상 사용되지 않습니다. 다음을 사용하십시오 : 다른 대답의 기본값을 – johnbakers

33

도움이되기를 바랍니다 ! 내 대답이 당신의 문제를 해결한다고 생각하니?
+0

이제 올바른 방법입니다. – johnbakers

+0

': default'는 현재 "regular"(Java 기반) Clojure에 존재하지 않지만, 그것을 추가하는 제안도 있습니다 : http://dev.clojure.org/jira/browse/CLJ-1293 –

관련 문제