A Modula3 programozási nyelv

Kivételkezelés

Szintaxis

A függvények definíciójában meg lehet adni, hogy milyen kivételek gyűrűzhetnek tovább az aktuális függvényből. A kivételkezelést a TRY-EXCEPT blokk segítségével tudjuk megoldani.

Kivételek definiálása

Ha az id egy címke és a T egy nem open array típusú változó, akkor a

EXCEPTION id(T)
kód deklarál egy kivételt, aminek az argumentuma T típusú. Ha a T-t elhagyjuk, akkor típus nélküli kivétel is létrehozható.

Kivételek kiváltása

Kivételeket a Raise kulcsszóval lehet kiváltani.

Kivételek kezelése

Az általános értelemben vett hagyományos kivételkezelést a TRY-EXCEPT-ELSE struktúrával lehet megvalósítani. A TRY kulcsszót követi a védett programblokk, az EXCEPT kulcsszó után lehet felsorolni megfelelő szintaxissal a kezelendő kivételeket és azt, hogy fellépésükkor mi a teendő. Az ELSE után az egyéb kivételeket kezelhetjük le, ahogy az megszokott.

TRY guarded statements EXCEPT | exception1,(parameter1) = > handler1 ... |exceptionn,(parametern) = > handlern ELSE handler0 END

A kivételkezelés alapeszközeit (TRY-EXCEPT) szemlélteti a következő példa:

... EXCEPTION FileError(TEXT); ... VAR rd1,rd2: Rd.T; (* Az Rd.T egy input stream, az Rd interfész része *) val1,val2: ARRAY [1..10] OF REAL; BEGIN TRY IF NOT SF.FileExists(File1) THEN (* SF: Simple File interfész *) RAISE FileError(File1) END; IF NOT SF.FileExists(File2) THEN RAISE FileError(File2) END; rd1:=SF.OpenRead(File1); (* olvasás egy fájlból stream-be *) rd2:=SF.OpenRead(File2); GetRealArray(rd1, val1); (* saját, megírt eljárásunk *) GetRealArray(rd2, val2); EXCEPT | FileError(fname) => SIO.PutText(fname & "nem létezik!\n"); | SIO.Error => SIO.PutText("Rossz formátum!"); END; (* TRY-EXCEPT *) ...
TRY-EXCEPT-ELSE kiértékelésének szabályai:
Egy másik eszköz:

Egy másik fajta struktúrával könnyen megoldható, hogy egy blokk memória-felszabadító része mindenképp végrehajtásra kerüljön, akár történt kivétel, akár nem. Ez a TRY-FINALLY struktúra.

Erőforrás lefoglalása TRY Erőforrás használata FINALLY Erőforrás felszabadítása END
Delegált kivételek:

Egy eljárás deklarálásakor megadhatjuk (a RAISES kulcsszóval), hogy a le nem kezelt kivételek közül melyeket adja tovább a hívó programrésznek. Azokra a kivételekre, melyeket nem adunk meg, az eljárás abortálni fog.

PROCEDURE A() RAISES {kivétel(ek)}=
BEGIN...

Kivételek terjedése

A kivételek felfelé gyűrűznek amíg nincs egy olyan kivételkezelő, ami a megfelelő típust kezelné. Mindegyik függvénynek meglehet mondani, hogy milyen kivételeket engedhet át, ha ezektől eltérő kivétel keletkezik, akkor a program az adott helyen terminál.

A kivételek továbbküldhetőségének szabályai: