Подтвердить что ты не робот

Идиоматическая обработка ошибок в Clojure

Когда я надел свою шляпу C, я думаю, что, возможно, идиоматический Clojure просто выполняет простую вещь и проверяет возвращаемые значения.

Когда я надел свою шляпу Java (неохотно, я должен добавить), я думаю, что, поскольку Clojure работает на JVM, естественным способом должно быть использование исключений JVM.

Когда я надену свою функциональную шляпу, я думаю, что должен быть какой-то монадический конструирующий или потоковый макрос, который может обрабатывать ошибки в виде композиций.

Итак, какой идиоматический способ обработки ошибок в программе Clojure?

4b9b3361

Ответ 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, за исключением того, что вам не нужно ничего проверять вручную.