Вместо генерации пользовательских классов существует два гораздо более простых способа использования пользовательских исключений:
throw+
и catch+
макросы, которые позволяют вам бросать и захватывать любой объект, а также исключения. clojure.lang.ExceptionInfo
, который обертывает сообщение и карту данных. Использование этого просто:
(throw (ex-info "My hovercraft is full of eels"
{:type :python-exception, :cause :eels}))
(try (...)
(catch clojure.lang.ExceptionInfo e
(if (= :eels (-> e ex-data :cause))
(println "beware the shrieking eels!")
(println "???"))))
Или в среднем тесте:
(fact "should throw some eels"
(...)
=> (throws clojure.lang.ExceptionInfo
#(= :eels (-> % ex-data :cause))))