Clojure:
Feilhåndtering

Hvordan:

Clojure, i likhet med sine Lisp forfedre, støtter seg på unntak for å håndtere feil. Slik viser du hva du er laget av når ting går dårlig.

Å kaste et unntak er rett frem:

(throw (Exception. "Oops! Noe gikk galt."))

Å fange et unntak, dette vil du gjøre mye:

(try
  ;; risikabel kode
  (/ 1 0)
  (catch ArithmeticException e
    (println "Kan ikke dele på null!"))
  ;; finally-blokken kjøres uansett
  (finally 
    (println "Oppryddingskode kommer her.")))

Eksempel på output for catch-blokken over:

Kan ikke dele på null!
Oppryddingskode kommer her.

Bruke ex-info og ex-data for rikere kontekst om unntak:

(try
  ;; forårsaker en tilpasset unntak
  (throw (ex-info "egendefinert feil" {:type :egendefinert-feil}))
  (catch Exception e
    ;; å hente ut data fra vårt egen definerte unntak
    (println (ex-data e))))

Eksempel på output:

{:type :egendefinert-feil}

Dypdykk

Historien om feilhåndtering i Clojure er ikke radikalt forskjellig fra andre Lisps eller til og med Java (som den arver try-catch mekanismen fra). Det er pragmatisk; å bruke unntak er hovedstien, akkurat som i Java, men Clojure tilbyr en funksjonell vri med ex-info og ex-data for rikere feildata.

Alternativer for feilhåndtering i Clojure inkluderer bruk av monadiske konstruksjoner, slik som either monaden fra biblioteker som cats, eller core.async for kanalbasert feilpropagering. Imidlertid er disse mer komplekse og brukes i spesifikke scenarier.

Historisk sett har feilhåndtering i programmeringsspråk utviklet seg fra enkle statusreturer til de mer sofistikerte unntakshåndteringsmekanismene i moderne språk. Clojure velger enkelhet og et snev av funksjonell programmering, og blander gammelt og nytt.

Se også