我如何在Clojure中抛出exception?

我想抛出一个例外,并有以下几点:

(throw "Some text") 

但似乎被忽略。

你需要把你的string包装在Throwable中 :

 (throw (Throwable. "Some text")) 

要么

 (throw (Exception. "Some text")) 

你也可以设置一个try / catch / finally块:

 (defn myDivision [xy] (try (/ xy) (catch ArithmeticException e (println "Exception message: " (.getMessage e))) (finally (println "Done.")))) 

REPL会话:

 user=> (myDivision 4 2) Done. 2 user=> (myDivision 4 0) Exception message: Divide by zero Done. nil 

clojure.contrib.condition提供了一个处理exception的Clojure友好手段。 你可以提出原因的条件。 每个条件可以有自己的处理程序。

在github的源码中有很多例子。

这是非常灵活的,因为你可以提供你自己的键,值提高时,然后决定在你的处理程序根据键/值做什么。

例如(篡改示例代码):

 (if (something-wrong x) (raise :type :something-is-wrong :arg 'x :value x)) 

那么你可以有一个处理程序:something-is-wrong

 (handler-case :type (do-non-error-condition-stuff) (handle :something-is-wrong (print-stack-trace *condition*))) 

如果你想抛出一个exception,并在其中包含一些debugging信息(除了消息string),你可以使用内置的ex-info函数。

要从以前构build的ex-info对象中提取数据,请使用ex-data 。

来自clojuredocs的例子:

 (try (throw (ex-info "The ice cream has melted!" {:causes #{:fridge-door-open :dangerously-high-temperature} :current-temperature {:value 25 :unit :celcius}})) (catch Exception e (ex-data e)) 

在评论中,kolen提到了弹弓 ,它提供了先进的function,不仅可以抛出任意types的对象(使用throw +),还可以使用更灵活的catch语法来检查抛出对象中的数据(使用try +)。 项目回购的例子:

张量/ parse.clj

 (ns tensor.parse (:use [slingshot.slingshot :only [throw+]])) (defn parse-tree [tree hint] (if (bad-tree? tree) (throw+ {:type ::bad-tree :tree tree :hint hint}) (parse-good-tree tree hint))) 

math/ expression.clj

 (ns math.expression (:require [tensor.parse] [clojure.tools.logging :as log]) (:use [slingshot.slingshot :only [throw+ try+]])) (defn read-file [file] (try+ [...] (tensor.parse/parse-tree tree) [...] (catch [:type :tensor.parse/bad-tree] {:keys [tree hint]} (log/error "failed to parse tensor" tree "with hint" hint) (throw+)) (catch Object _ (log/error (:throwable &throw-context) "unexpected error") (throw+))))