Я хочу исключить исключение и иметь следующее:
(throw "Some text")
Однако он, кажется, игнорируется.
Я хочу исключить исключение и иметь следующее:
(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 +). Примеры из репо проекта:
Тензор/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)))
математика/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+))))