Если вы хотите выдать исключение и включить в него некоторую отладочную информацию (в дополнение к строке сообщения), вы можете использовать встроенную функцию 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))
В комментарии, упомянутом Коленом рогатка , которая предоставляет расширенные функциональные возможности, которые позволяют не только генерировать объекты произвольного типа (с помощью 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+))))