例外をスローしたいのですが、次のものがあります。
(throw "Some text")
しかし無視されているようです。
文字列を Throwable でラップする必要があります:
(throw (Throwable. "Some text"))
または
(throw (Exception. "Some text"))
Try/catch/finallyブロックも設定できます:
(defn myDivision [x y]
(try
(/ x y)
(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 は、例外を処理する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*)))
例外をスローし、(メッセージ文字列に加えて)デバッグ情報をそこに含めたい場合は、組み込みの ex-info 関数を使用できます。
以前に構築された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は slingshot について言及しました。これは、(throw +を使用して)任意のタイプのオブジェクトをスローするだけでなく、より柔軟なcatch構文を使用して、スローされたオブジェクト内のデータを検査する(さらにtry +)。 project repo の例:
tensor/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+))))