A Clojure programozási nyelv

Kivételkezelés

Kivételek kiváltása és kezelése

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.