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