Clojure:
Gestione degli errori
Come fare:
Clojure, come i suoi antenati Lisp, si affida alle eccezioni per la gestione degli errori. Ecco come mostrare di cosa sei capace quando le cose vanno male.
Lanciare un’eccezione è semplice:
(throw (Exception. "Oops! Qualcosa è andato storto."))
Catturare un’eccezione, lo farai spesso:
(try
;; codice a rischio
(/ 1 0)
(catch ArithmeticException e
(println "Non si può dividere per zero!"))
;; il blocco finally viene eseguito comunque
(finally
(println "Il codice di pulizia va qui.")))
Esempio di output per il blocco catch sopra:
Non si può dividere per zero!
Il codice di pulizia va qui.
Utilizzando ex-info
e ex-data
per un contesto più ricco riguardo alle eccezioni:
(try
;; causando un'eccezione personalizzata
(throw (ex-info "Errore personalizzato" {:type :custom-failure}))
(catch Exception e
;; estrarre i dati dalla nostra eccezione personalizzata
(println (ex-data e))))
Esempio di output:
{:type :custom-failure}
Approfondimento
La storia della gestione degli errori in Clojure non è radicalmente diversa da altri Lisp o persino da Java (da cui eredita il meccanismo try-catch
). È pragmatica; l’uso delle eccezioni è la via principale, proprio come in Java, ma Clojure offre un tocco funzionale con ex-info
e ex-data
per dati di errore più ricchi.
Le alternative per la gestione degli errori in Clojure includono l’uso di costrutti monadici, come la monade either
da librerie come cats
, o core.async per la propagazione di errori basata su canali. Tuttavia, questi sono più complessi e usati in scenari specifici.
Storicamente, la gestione degli errori nei linguaggi di programmazione si è evoluta dai semplici ritorni di stato ai meccanismi di gestione delle eccezioni più sofisticati dei linguaggi moderni. Clojure opta per la semplicità e un tocco di programmazione funzionale, miscelando il vecchio e il nuovo.
Vedi Anche
- Guida di Clojure alle eccezioni: https://clojure.org/guides/exceptions
- Libreria “Cats” per approcci più funzionali: https://github.com/funcool/cats
- “Core.async” per la programmazione asincrona: https://github.com/clojure/core.async