我如何在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+))))