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

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

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

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

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


person Emil Eriksson    schedule 02.01.2015    source источник
comment
Почти чувствуется, что монада Либо принадлежит ядру Clojure. Простое выбрасывание исключения, что я считаю типичным, похоже на возврат к императивному способу ведения дел.   -  person Mario    schedule 12.06.2015


Ответы (3)


Обработка ошибок Clojure, как правило, ориентирована на исключения (непроверенные) JVM.

Slingshot делает использование исключений более приятным, позволяя, например, деструктурировать выброшенные значения исключений.

Для альтернативы, которая позволяет обрабатывать ошибки в стиле erlang, вы должны посмотреть dire. Это сообщение в блоге дает хороший обзор рациональности для dire, а также обзор механизмов обработки ошибок и недостатков Clojure.

person Symfrog    schedule 02.01.2015
comment
Исходная ссылка перенаправляет на какой-то странный спам. Вот ссылка на архив сообщения в блоге: http://web.archive.org/web/20150301143918/http://michaeldrogalis.tumblr.com/post/40181639419/try-catch-complects-we-могу-сделать-намного-лучше - person mskoh52; 27.07.2020
comment
@ mskoh52 спасибо, теперь я также обновил ссылку в ответе - person Symfrog; 27.07.2020

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

person nha    schedule 14.09.2015
comment
Как Haskeller, я предпочитаю монадный подход Maybe от faaaar, но я не думаю, что это идиоматический Clojure. - person MasterMastic; 12.03.2016
comment
Я играл только в реплику с кошками, но знаю, что некоторые люди используют ее в продакшене. Также есть github.com/uncomplicate/fluokitten и, возможно, даже github.com/bwo/monads, но существует множество библиотек обработки ошибок (например, dire и slingshot), так что это определенно похоже на что-то что может быть улучшено в основном языке. - person nha; 12.03.2016

Официальным средством обработки ошибок в Clojure являются исключения, поскольку они поставляются с JVM. Однако функции непрозрачны с точки зрения ссылок, когда они генерируют исключения, и это свойство также не компонуемо. Исключения не работают.

Многие люди пробовали альтернативную/монадную обработку ошибок в разных стилях в Clojure. Для этой цели я создал Promenade https://github.com/kumarshantanu/promenade и хорошо опыт его использования.

person Shantanu Kumar    schedule 30.10.2018