Clojure:
Virheiden käsittely

Miten:

Clojure, kuten sen Lisp-esivanhemmat, nojaa poikkeusten varaan virheiden käsittelyssä. Tässä on miten näytät mihin olet kykeneväinen, kun asiat menevät pieleen.

Poikkeuksen heittäminen on suoraviivaista:

(throw (Exception. "Voi! Jotain meni pieleen."))

Poikkeuksen ottaminen kiinni—tätä tulet tekemään paljon:

(try
  ;; riskialtis koodi
  (/ 1 0)
  (catch ArithmeticException e
    (println "Ei voi jakaa nollalla!"))
  ;; finally-lohko suoritetaan joka tapauksessa
  (finally 
    (println "Siivouskoodi tulee tähän.")))

Esimerkkituloste yllä olevasta catch-lohkosta:

Ei voi jakaa nollalla!
Siivouskoodi tulee tähän.

Käyttäen ex-info ja ex-data rikastamaan poikkeusten kontekstia:

(try
  ;; aiheuttaen mukautetun poikkeuksen
  (throw (ex-info "Mukautettu virhe" {:type :custom-failure}))
  (catch Exception e
    ;; otetaan data ulos mukautetusta poikkeuksesta
    (println (ex-data e))))

Esimerkkituloste:

{:type :custom-failure}

Syväsukellus

Virheenkäsittelytarina Clojuressa ei radikaalisti eroa muista Lispeistä tai edes Javasta (jolta se perii try-catch-mekanismin). Se on pragmaattinen; poikkeusten käyttö on päälinja, aivan kuten Javassa, mutta Clojure tarjoaa funktionaalisen maun ex-info ja ex-data avulla rikkaamman virhedatan myötä.

Vaihtoehdot virheenkäsittelyyn Clojuressa sisältävät monadiset rakenteet, kuten either-monadi kirjastoista kuten cats, tai core.async kanavapohjaiseen virheiden etenemiseen. Nämä ovat kuitenkin monimutkaisempia ja niitä käytetään erityistilanteissa.

Historiallisesti virheenkäsittely ohjelmointikielissä on kehittynyt yksinkertaisista statuspalautuksista nykykielten monimutkaisempiin poikkeustenkäsittelymekanismeihin. Clojure valitsee yksinkertaisuuden ja funktionaalisen ohjelmoinnin ripauksen, yhdistäen vanhaa ja uutta.

Katso Myös