Clojure:
Hantering av fel

Hur man gör:

Clojure, i likhet med sina Lisp-förfäder, förlitar sig på undantag (exceptions) för att hantera fel. Så här visar du vad du går för när saker och ting går åt skogen.

Att kasta ett undantag är enkelt:

(throw (Exception. "Oops! Något gick fel."))

Att fånga ett undantag, något du kommer att göra ofta:

(try
  ;; riskabel kod
  (/ 1 0)
  (catch ArithmeticException e
    (println "Kan inte dela med noll!"))
  ;; finally-blocket körs oavsett
  (finally 
    (println "Städkod går här.")))

Exempel på utskrift för ovanstående catch-block:

Kan inte dela med noll!
Städkod går här.

Användning av ex-info och ex-data för rikare kontext om undantag:

(try
  ;; orsaka ett anpassat undantag
  (throw (ex-info "Anpassat fel" {:type :custom-failure}))
  (catch Exception e
    ;; att få ut datan från vårt anpassade undantag
    (println (ex-data e))))

Exempel på utskrift:

{:type :custom-failure}

Fördjupning

Felhanteringsberättelsen i Clojure är inte radikalt annorlunda från andra Lisps eller ens Java (från vilket den ärver try-catch-mekanismen). Det är pragmatiskt; att använda undantag är huvudvägen, precis som i Java, men Clojure erbjuder en funktionell touch med ex-info och ex-data för rikare feldata.

Alternativ för felhantering i Clojure inkluderar att använda monadiska konstruktioner, såsom either-monaden från bibliotek som cats, eller core.async för kanalbaserad felpropagering. Dessa är dock mer komplexa och används i specifika scenarion.

Historiskt sett har felhantering i programmeringsspråk utvecklats från enkla statusreturer till de mer sofistikerade undantagshanteringssystemen i moderna språk. Clojure väljer enkelhet och en nypa funktionell programmering, som blandar gammalt och nytt.

Se även