Идиоматическая обработка ошибок в Clojure
Когда я надел свою шляпу C, я думаю, что, возможно, идиоматический Clojure просто выполняет простую вещь и проверяет возвращаемые значения.
Когда я надел свою шляпу Java (неохотно, я должен добавить), я думаю, что, поскольку Clojure работает на JVM, естественным способом должно быть использование исключений JVM.
Когда я надену свою функциональную шляпу, я думаю, что должен быть какой-то монадический конструирующий или потоковый макрос, который может обрабатывать ошибки в виде композиций.
Итак, какой идиоматический способ обработки ошибок в программе Clojure?
Ответы
Ответ 1
Clojure Обработка ошибок - это, как правило, исключение JVM (неконтролируемое).
Slingshot делает использование исключений более приятным, позволяя, например, деструктурировать значения брошенных исключений.
Для альтернативы, которая позволяет обрабатывать ошибки в стиле erlang, вы должны посмотреть dire. Это сообщение в блоге дает хороший обзор рационального для страшного, а также обзор механизмов и недостатков обработки ошибок Clojure.
Ответ 2
Для очень функционального подхода взгляните на cats
, который будет соответствовать "некой монадической конструкции":
Теория категорий и алгебраические абстракции для Clojure и ClojureScript. http://funcool.github.io/cats/latest/
Пример, взятый из их документации:
(require '[cats.core :as m])
(require '[cats.monad.maybe :as maybe])
(m/mappend (maybe/just [1 2 3])
(maybe/nothing)
(maybe/just [4 5 6])
(maybe/nothing))
Вы можете видеть, что nothing
несколько эквивалентен nil
, за исключением того, что вам не нужно ничего проверять вручную.