A Ruby programozási nyelv

Kivételkezelés

1. Szintaxis

A Ruby kivételkezelése a Javáéhoz hasonló. A kivételek paramétere egy string lehet, mely csak abban az esetben informatív, ha a program futását megszakítja. Ebben az esetben kiírásra kerül. A kivételeknek az Exception osztályban definiált to_s, to_str vagy message metódusával kinyerhető a string paraméter, így benne más információ is szállítható.

2. Kivételek definiálása

Saját kivételt egyszerűen az Exception osztályból való örökléssel hozhatunk létre. Alprogramok által kiváltható kivétellista nem definiálható.

3. Kivételek kiváltása

A meglevő kivételosztályok közül bármelyiket kiválthatjuk a raise kulcsszóval. A raise-nek több formája is használható. Paraméter nélküli formában az utolsó kivétel ismételt kiváltását fogja eredményezni. String paraméterrel egy Runtime Error-t vált ki, ahol is a string a kivétel paramétere és természetesen megjeleníti az interpreter. A raise után egy kivétel neve, azaz egy kivételosztály neve is állhat, ilyenkor értelemszerűen a megnevezett kivételt fogja kiváltani. Kivétel kiváltásakor a $! változóba kerül egy az adott Exception példányra mutató hivatkozás. Példa:

opFile = File.open(opName, "w") begin # Az itt dobott exception-öket a lenti rescue blokk fogja elkapni while data = socket.read(512) opFile.write(data) end rescue SystemCallError $stderr.print "IO failed: " + $! opFile.close File.delete(opName) raise end

4. Kivételek kezelése

A kivételkezelés az utasításblokkok szintjén működik. A begin-end blokk végén elhelyezhető egy rescue rész, így a begin és a rescue között kiváltódott kivételeket a rescue és az end között lehet lekezelni. A blokknak lehet ensure záradéka is, ami a blokk befejeztével feltétlenül végrehajtható kódot tartalmazhatja:

begin data = infile.read (SIZE) rescue IOError print "error accessing file" raise # tovabbadjuk a kivetelt ensure infile.close outfile.close end

Kétféle végső tevékenységet is megadhatunk egy blokkhoz kapcsolva. Az egyik a már bemutatott ensure, ami egy elkerülhetetlenül végrehajtásra kerülő kódot definiál, a másik pedig a begin-end szerkezet else ága. Ez akkor kerül végrehajtásra, ha a blokkban nem váltódott ki kivétel. A kivételt lekezelő rescue ágakban a raise sor az éppen kezelés alatt álló kivételt ($!) ismételten kiváltja. Ha a rescue záradék egy retry sort is tartalmaz, kivétel esetén a begin-end törzse ismételten kiértékelődik. A retry egyébként iterátorokban is használható, persze kicsit más jelentéssel.

5. Kivételek terjedése

A párhuzamos végrehajtásból fakadó hibákat a ThreadError jelzi. Párhuzamos program esetén a felhasználó által küldött szignáloknak megfelelő kivételek a fő szálban váltódnak ki, mert a fő szál terminálása maga után vonja a többi végrehajtási szál befejeződését. A váratlan kivételek terminálják a programot, és megjelenítik a kivétel paramétereként megadott stringet. Kivétel a kivételkezelőben is kiváltható, és nem csak a paraméter nélküli raise formával, hanem ez a kezelt kivételtől eltérő kivétel is lehet. A kivételkezelőben kiváltott kivételeket a magasabb szinten levő kivételkezelő fogja lekezelni.