A PL/1 programozási nyelv

Kivételkezelés

Kivételkezelés

A program működése során bekövetkező kivételes események kezelésére a PL/1 az ON utasítást vezeti be. Az ON utasításban meg kell adni az esemény nevét és egy utasítást, ami az esemény bekövetkeztekor végrehajtódik. Ez az utasítás lehet blokk is.

Az ON utasítás egy blokkon belüli hatóköre addig tart, amíg a blokkon belül nem talál egy másik olyan ON utasítást, ami az adott eseményt kezeli. Ekkor az előző ON hatóköre megszűnik. Ha bekövetkezik az esemény, akkor azonnal végrehajtódik az ON-ban megadott utasítás(sorozat), mely végén a vezérlés visszaadódik arra a helyre, ahol a kivételes esemény bekövetkezett. Ez alól egyedül a GOTO kivétel, ugyanis ha az ON utasításban egy GOTO-t adunk meg, akkor a vezérlés csak a GOTO-val definiált címkénél fog folytatódni az esemény bekövetkezésénél.

ON eseménynév utasítás; ON eseménynév(file) utasítás; ON eseménynév BEGIN ... END; ON eseménynév(file) BEGIN ... END;

Az ON-utasítás hatásköre az utasítás helyétől az utasítást tartalmazó blokk végéig tart. Amennyiben egy bekövetkezett eseményhez nem tartozik ON-utasítás, a program az eseményről üzenetet ír az elsődleges output perifériára, majd - az eseménytől függően - folytatódik vagy abortál (pl. ha az esemény egy programhiba volt).

A leggyakrabban használt ON utasítások:
ON ENDFILE - input file vége ON ZERODIVIDE - 0-val való osztás ON FIXEDOVERFLOW - fixpontos mező túlcsordulás ON UNDERFLOW - lebegőpontos alsó túlcsordulás ON KEY(file-név) - kulcsos állományban kulcs-hiba

Lehet a predefinit eseményeket használni, de a programban alkalmazhatunk saját eseményeket is. Erre nincs külön eseménydeklaráló utasítás, hanem az ON CONDITION(saját-esemény) utasítással kezelhető. Persze ezt csak magunk idézhetjük elő a SIGNAL CONDITION(saját-esemény) utasítással.

Bizonyos rendszeresemények letilthatók úgy, ha adott utasítás elé zárójelben (mintha címke lenne) leírjuk az esemény nevét. Ekkor az utasításban nem fog bekövetkezni (el fog nyelődni) az adott esemény. Az utasítás természetesen blokk is lehet, ekkor az egész blokkra vonatkozik az elnyelés. További lehetőség van arra, hogy az ON utasításban a SYSTEM kulcsszóval az adott esemény bekövetkeztekor az operációs rendszernek adjuk át a hibakezelést (default). Ennek akkor van értelme, ha egy külső blokkban átdefiniáltuk az eseményt, de azt szeretnénk, hogy például egy eljáráson belül a rendszer kezelje mégis a hibaeseményt.

A példában az eljárásban megtiltjuk az indextúllépés ellenőrzését és eseményként való észlelését, megköveteljük viszont, hogy a túlcsordulás legyen esemény, s az erre vonatkozó ON-utasítás hajtódjon végre, ha túlcsordulás következik be. A második példában megtiltjuk a nullával való osztás hibaként való észlelését:

(NOSUBRG,OVERFLOW) : PR : PROCEDURE; { ...} END;
(NOZERODIVIDE) : S = Q / I;

Egy esemény ellenőrzésének (észlelésének) kikapcsolása úgy történik, hogy a neve elé a NO előtagot tesszük.

További lehetőség, hogy használjuk a CHECK kulcsszót, aminek paramétereként meg kell adni változóneveket és belépési pontokat. Ezt is utasítások elé (vagy blokk elé) kell beírni, aminek hatására, ha az adott utasításban (blokkban) megváltozik a megadott változó értéke, a megadott címkére ugrik. Ez tulajdonképpen a programok hibakeresésénél lehet fontos.