Az ABAP programozási nyelv

Kivételkezelés

Kivételek kiváltására függvényen belül két lehetőségünk van: a RAISE <kivétel>., valamint a MESSAGE <üzenet> RAISING <kivétel>. parancsok. Ha a rendszer kezeli le a kivételt, akkor megszakítja a program futását és hiba kereső módba kapcsol. Ha a kivételt a függvény CALL FUNCTION utasítás EXCEPTIONS, vagy OTHERS ágában felsoroltuk, akkor a program kapja meg a kivétel lekezelésének a jogát. Miután a kivételt lekezelte a hívó program kapja meg a vezérlést és csak azokat az adatokat kapja meg, amelyeket referenciaként adtunk át. A MESSAGE <üzenet> RAISING <kivétel>. utasítás nem ír ki semmiféle üzenetet, hanem beállít néhány rendszerváltozót, melyeket a programunkból lekérdezhetünk.

A kivételek felfelé terjednek. Az előre definiált üzenetek a T100-as táblában találhatóak meg és mi magunk is hozzá írhatunk. Öt darab előredefiniált üzenet osztály létezik:

Osztály alapú kivételkezelés

Az osztály alapú kivételkezelés a kivétel osztályok ötletén alapszik. Kivétel osztályok definiálhatók az az ABAP Workbench-ben az Exception Builder segítségével. Számos előre definiált kivétel osztály megtalálható. Egy kivétel helyzet esetén a kivételt egy objektum, a kivétel osztály egy példánya reprezentálja. A kivétel objektum attribútumaiban találhatunk információt a hibáról. Minden kivétel osztály öröklési fájában megtalálható a CX_ROOT ősosztály.
Az osztály alapú kivételek nincsenek az ABAP Objects-re korlátozva. Éppen ellenkezőleg, az előző kivételkezelési koncepciók helyettesítésére lettek tervezve, tehát minden ABAP kontextusban (programok, végrehajtási blokkok) használhatók.
Az osztály alapú kivételeket a RAISE EXCEPTION utasítás vagy az ABAP Runtime Environment válthatja ki. Azok a kivételek, amiket procedúrákban kiváltottak, de nem kezeltek le, továbbításra kerülnek a hívónak. A hívó ezt lekezeli vagy továbbküldi. Annak a biztosítására, hogy egy procedúra meghívója tudja milyen kivételek keletkezhetnek, a procedúra minden lekezeletlen kivételét meg kell adni az interfészben a RAISING paraméter után. Ez a szabály megkerülhető specifikus kivétel osztályok használatával.
Kivételkezelő definiálható egy vagy több kivétel osztályra. A kivétel osztályok minden alosztályának kezelésére létre kell hozni egy fő osztályt. Így egymással összefüggő kivételek csoportja is kezelhető egy kivétel kezelővel.
A kivétel osztályok elnevezése konvenció szerint ’CX_’ prefix-el történik.
A kivételek kezelése TRY struktúrában történik. A TRY utasítás ENDTRY kulcsszóval kell végződjön. A struktúrában a CATCH segítségével kezelhetjük a kivételeket. Ennek a formája a következő: CATCH <ex> INTO <ref>. Itt az <ex> a kivétel osztály azonosítóját, a <ref> a kivétel objektumra egy referencia változót jelöl. A <ref>-nek általában az OREF azonosítót adják, amit DATA <ref> TYPE REF TO <ex> definícióval szoktak megadni. A TRY struktúrában van lehetőség a kivételek kiváltására is. Ezt a RAISE utasítás segítségével tehetjük meg. Általános formája: RAISE EXCEPTION TYPE <ex> [EXPORTING ... <f> = <a> ...]. Itt <f> a kivétel objektum egyik attribútuma, <a> pedig a kivétel kiváltásakor elérhető érték. Látható, így módosíthatja a felhasználó a kivétel objektum attribútumait további információt és segítséget adva a sikeres kezeléshez.