A Groovy programozási nyelv

Kivételkezelés

8. Kivételkezelés

A Groovy a Java-hoz hasonló kivételkezelést használ. A kivételek (Exceptions) és hibák (Errors), együtt Throwables helye az objektum hierarchiában:
java.lang.Object    
  java.lang.Throwable  
    java.lang.Error
    java.lang.Exception
Errors: olyan hibák, amelyek a program hibás működéséhez vezetnek.
Exceptions: események, amelyek lekezelhetőek a programban.
Szintaxis:
try{:megfigyelendő szakasz eleje
...kód...: ami kivételt vagy hibát dobhat
}:megfigyelendő szakasz vége
finally{...}Mindig végrehajtódik, még akkor is, ha kivétel dobódik a try blokkban.
catch(paraméterek){ kód }: hiba kiváltódásakor, valamint ha a hiba a paraméterek valamelyikének megfelel, akkor a *kód* rész végrehajtódik. Több catch blokk is tartozhat egy try blokkhoz.
Egy kivétel addig kerül egyre feljebb a hívási listában (vagy egymásba ágyazott blokkokban) csak a 'finally' blokkban lévő kódokat végrehajtava, amíg valahol el nem kapják, vagy a szál nem terminál.
Néhány alapvető kivétel:
java.lang.ArithmeticException()
java.lang.ArrayIndexOutOfBoundsException()
java.lang.NullPointerException()
java.io.IOException()
Példa kivétel terjedésére egymásbaágyazott blokkokban:
class MyException extends Exception{} def z try{ try{ throw new MyException() assert false } }catch(e){ assert e in MyException z= 'been here' } assert z == 'been here'
Példa kivétel terjedésére függvényhívásokban:
class MyException extends Exception{} def z= [] def met(){ throw new MyException() } try{ met(); assert false } catch(e){assert e in MyException; z << 'function'} class M{ def m(){ throw new MyException() } } try{ new M().m(); assert false } catch(e){assert e in MyException; z << 'method' } def c= { throw new MyException() } try{ c(); assert false } catch(e){assert e in MyException; z << 'closure'} assert z == ['function', 'method', 'closure'] //Method embedded in closure... def z2 def d= { new M().m(); assert false } try{ d(); assert false } catch(e){assert e in MyException; z2= 'closure d'} assert z2 == 'closure d'