A kivételkezelés működése hasonló a többi nyelvéhez. A kivételkor kiváltodó szignál kifelé és
blokkonként terjed. Amennyiben az adott szignál nem került lekezelésre a egyik blokkban sem,
abban az esetben a nyelv automatikusan lekezeli azt. A kivételkezelés lehetséges helyei a kódban:
'begin' és 'end' között, illetve 'begin transaction', 'case', 'event', 'event handler', 'for',
'if','while' utasitásokban szerepelhetnek.
Elöre definiált kivételek
A kivételek a nyelv által elöre definiált GenericException osztály és az ebböl örökölt osztályok
valamelyike által kezelhetök le. Hat fő osztály öröklödik a GenericException-ből. Ezek a következök:
Kivételek: |
Megjegyzés:
|
AbortException |
Tranzakció abort-álásakor.
|
ResourceException |
Valamelyik manager generálja. (pl.: DBMS, file, lock)
|
CancelException |
Taskok kommunikációjakor jön létre.
|
ArithmeticException |
Hibás artitmetikai müveletek esetén van. (pl.: túlcsordulás, 0-val való osztás)
|
DataTypeException |
Hibás adatkonverzió és null érték esetén áll elő.
|
DefectException |
Bug-ok esetén váltódik ki. (pl.: NIL object, hibás metódus használat)
|
A felsorolt hat osztály mindegyike még több alosztályt tartalmaz.
Felhasználó által definiált kivételek
Saját kivétel létrehozása mindig a GenericException osztályból öröklödik. A kivételek kiváltódása
történhet automatikusan illetve expliciten a programozó által. Ekkor a kivétel kiváltódása a
'raise' parancs segítségével történik.
Kivételek lekezelése
A kivételek lekezelése a blokkon belöl az 'exception' parancs után következnek. Minden blokknak
lehet saját kivételkezelője. Amennyiben egy kivétel kiváltódott, úgy a Forté ellenörzi, hogy
melyik 'when' ágban kezelődik le. Ha nincs megfelelő osztály a 'when' ágban, akkor megnézi, hogy
valamelyikböl öröklödéssel keletkezett-e. Ha igen, akkor az a 'when' ág kerül végrehajtásra,
különben pedig az 'else' ágra kerül a vezérlés. Amennyiben nincsen 'else ág', úgy egy blokkal
feljebb kerül a vezérlés. A 'when' ágaknak nem kell diszjunktaknak lenniük. Ebben az esetben az
az ág hajtódik végre, amelyikhez az adott kivétel a legközelebb áll. Kivételkezelés syntaxisa:
EXCEPTION
[WHEN változó_név: osztály DO utasítás_blokk]...
[ELSE [DO] utasítás_blokk]
Példa:
begin
...
exception
when e : AbortException do
...
when e : ResourceException do
...
else do
...
end;