Kivételkezelésre a más nyelvekből is megszokott try-catch-finally blokkok szolgálnak. Catch blokkból több is lehet (de furcsamód akár nulla is), a finally blokkból legfeljebb csak egy, ami természetesen opcionális. A kiértékelés a try blokkon belül egy implicit do formán belül történik, ha nem lép fel hiba vagy kivétel, akkor a try blokk értéke a legutolsó kiértékelt kifejezés:
user=> (try "a" "b" "c") "c"
Amennyiben kivétel lép fel, a kiértékelés megszakad, és a catch blokkok vizsgálata következik. Ez a megszokott módon, sorban történik, és ha van a hiba/kivétel típusára illeszkedő kivételkezelő rész, akkor a megfelelő catch blokk értéke lesz a visszatérési érték:
user=> (try (/ 6 0) (catch ArithmeticException ex "hopp") (catch Exception ex (. ex getMessage))) "hopp" user=> (try (/ 6 0) (catch Exception ex (. ex getMessage)) (catch ArithmeticException ex "hopp")) "Divide by zero"
A finally opcionális, de ha meg van adva, mindig lefut, ilyenkor viszont az itt megadott kifejezés kizárólag a mellékhatásai miatt lesz érdekes: itt zárhatjuk le a megnyitott fájlokat, adatbázis-kapcsolatokat, stb. De a finally-ban megadott kifejezés értéke sosem lesz a try blokk visszatérési értéke!
user=> (try (/ 6 0) (catch ArithmeticException ex "hopp") (catch Exception ex (. ex getMessage)) (finally (prn "kopp"))) "kopp" "hopp"
Kivételt a (throw) hívásával dobhatunk. Új kivétel objektumot létrehozhatunk az (ex-info) hívásával, ez a clojure.lang.ExceptionInfo típus egy példányát hozza létre. Ennek megadhatunk egy mapet is, amit az (ex-data) hívásával olvashatunk ki belőle.