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'