Bevezetés
Az RPG programok futása során két szempont veendő figyelembe: hiba általában csak I/O műveletnél léphet fel, ezt vagy indikátorokkal mi lekezeljük, vagy a file specifikálásakor megadunk egy hibakezelő eljárás nevét, és az automatikusan meghívódik hiba esetén, ha mi nem kezeljük le külön. A másik - elméleti - meggondolás az, hogy a működés során nyomon követhető legyen, hogy a program mit hajtott végre eddig, tehát általában a programok bőségesen írnak egy logfile-ba, amiből nyomonkövethető a program állapota. Segítséget nyújt az operációs rendszer is, amely kivétel esetén a rendszeroperátornak küldött üzenetben írja le (OS/400-as operációs rendszeren például a QHST history log minden ilyen, és ehhez hasonló üzenetet feljegyez), hogy milyen problémába ütközött a futás során, és lehetőséget ad az operátornak, hogy a program működését leállítsa, DUMP-ot kérjen a változókról, vagy egyéb üzenetet válaszoljon a futtató rendszernek.
Az RPG-ben program ill. file hibákat/kivételeket különböztetünk meg. A kivételekről információkat ún. file information, ill. program status struktúrákon keresztül kaphatunk.
File-hibák
File hibák lépnek fel (többek közt) a következő esetekben:
- hivatkozás nem definiált record típusra
- hiba egy triggerben
- I/O műveletet kísérlünk meg egy már lezárt fájlra
- device error
- tömb vagy táblázat betöltésekor fellépett (sorrendi) hiba
Hibák (kivételek) kezelésére a következő lehetőségek állnak rendelkezésünkre:
- Az E op-code extender használata. Ebben az esetben az adott op-code végrehajtása előtt a %ERROR és a %STATUS beépített függvények 0-t adnak vissza. Ha egy hiba történik az op-code végrehajtása közben, akkor az utasítás végrehajtása után az %ERROR 1-et ad vissza, a %STATUS pedig a file státuszt.
- Ha a 73-74. pozícióban megadunk egy indikátort az adott op-code-ot tartalmazó C-kártyán, akkor hiba esetén az indikátor bebillen, és a file information struktúra tartalmazza a további információkat a hibáról.
- Ún. ON-ERROR groupok használhatók az ún. MONITOR blokkokban elhelyezett utasítások feldolgozásakor fellépett hibák kezelésére
- A nyelv ILE-környezethez illeszkedő verzióiban használhatjuk az ILE kivételkezelési szolgáltatásait is
- File exception/error subroutine megadásával. A szubrutin nevét a file leírásakor adhatjuk meg (az INFSR kulcsszóval). Ugyanott az INFDS kulcsszó adja meg azt a file information struktúrát, ami az adott hibáról nyújt információt.
- Ha a fentiek közül egyik lehetőséggel sem élünk, akkor a nyelv default error handlere lép működésbe, amely pl. az ILE esetben elindít egy ILE exception rollbacket, és a kivételt az RPG-n kívül is elkaphatjuk és kezelhetjük (pl. CL programból)
Program hibák
Program hibák léphetnek fel (többek közt) az alábbi esetekben:
- nullával osztáskor
- negatív szám négyzetgyökének kiszámolására tett kísérletnél
- érvénytelen tömbindex használatakor
- sztringek elejének ill. hosszának hibás megadásakor
Programhibák kezelésére a file-hibák kezeléséhez hasonló lehetőségeink vannak:
- Az E op-code extender használata
- indikátor a 73-74. pozícióban
- ON-ERROR groupok használata
- ILE kivételkezelő használata
- Program exception/error subroutine használata: A BEGSR op-code factor1 mezőjében megadott *PSSR-rel. A hibáról információt tartalmazó program státusz struktúrát az adatdefiníciós specifikációkban adhatjuk meg (az adott D kártya 23. oszlopába írt S karakterrel).
- A nyelv default exception handlere lép működésbe
A file-, ill. program exception/error subroutine
Általában ugyanúgy használhatjuk a kivételkezelő szubrutinjainkat, mint egy közönséges szubrutint, pl. akár közvetlenül is meghívhatjuk őket. Ami érdekessé teszi őket, hogy a szubrutin végeztével az ENDSR specifikációban megadhatjuk, hogy hol (az RPG-ciklus melyik pontján) folytatódjon a vezérlés. A következő lehetőségeink vannak:
- *DETL -- a részeredménynyomtatások (detail lines) kezdeténél
- *GETIN -- az input rekord beolvasásánál
- *TOTC -- az összegszámítások (total calculations) kezdeténél
- *TOTL -- az összegnyomtatások (total lines) kezdeténél
- *OFL -- a lapváltást vezérlő sorokra (overflow lines)
- *DETC -- a részeredményszámítások (detail calculations) kezdeténél
- *CANCL -- a program futtatásának leállítását kérjük
- egyébként: az RPG default handlere kapja a vezérlést