Clojure:
Обробка помилок
Як це робити:
Clojure, як і її предки Lisp, покладається на виключення для роботи з помилками. Ось як ви показуєте, з чого ви зроблені, коли ситуація зайшла в глухий кут.
Викидання виключення є простим:
(throw (Exception. "Ой! Щось пішло не так."))
Перехоплення виключення, ви будете робити це часто:
(try
;; ризикований код
(/ 1 0)
(catch ArithmeticException e
(println "Не можна ділити на нуль!"))
;; блок finally виконується в будь-якому випадку
(finally
(println "Код для прибирання знаходиться тут.")))
Приклад виводу для вищезазначеного блоку catch:
Не можна ділити на нуль!
Код для прибирання знаходиться тут.
Використання ex-info
та ex-data
для більш повного контексту про виключення:
(try
;; виклик власного виключення
(throw (ex-info "Специфічна помилка" {:type :custom-failure}))
(catch Exception e
;; отримання даних з нашого власного виключення
(println (ex-data e))))
Приклад виводу:
{:type :custom-failure}
Поглиблене вивчення
Історія обробки помилок у Clojure не радикально відрізняється від інших Lisps або навіть Java (від якої вона успадкувала механізм try-catch
). Це прагматично; використання виключень є основним шляхом, як і в Java, але Clojure пропонує функціональний смак з ex-info
та ex-data
для більш багатих даних про помилки.
Альтернативи для обробки помилок у Clojure включають використання монадичних конструкцій, таких як монада either
із бібліотек, подібних до cats
, або core.async для поширення помилок через канали. Однак, вони більш складні та використовуються в специфічних сценаріях.
Історично обробка помилок у мовах програмування еволюціонувала від простого повернення статусу до більш складних механізмів обробки виключень сучасних мов. Clojure вибирає простоту та дотик функціонального програмування, поєднуючи старе з новим.
Дивіться також
- Посібник Clojure по виключенням: https://clojure.org/guides/exceptions
- Бібліотека “Cats” для більш функціональних підходів: https://github.com/funcool/cats
- “Core.async” для асинхронного програмування: https://github.com/clojure/core.async