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

Дивіться також