[Az alábbi idézet forrása: Szlávi Péter – „A Programkészítés didaktikája.”, PhD értekezés, 104-107. o.]
A következő kódrész rávilágít arra, hogy egy kivételkezelési lehetőségeket nem tartalmazó nyelvben (mint a Pascal) hogyan lehetne következetesen végigvinni a kivételkezelést:
A |
{Hibakezelés inic:} |
B |
fN:='KODOL.BE'; |
C |
If hibaKod=OK then |
D |
For i:=1 to N do |
E |
If hibaKod<>Hiba_NemLetezoFile then
Close(f); |
F |
{Hibakezelö "farok":} |
Az A-val jelölt részben a hiba bekövetkezésének (és milyenségének) rögzítését végző hibaKod változó alaphelyzetbe hozása történik.
A B rész az ellenőrzött megnyitást végzi; s hiba esetén egy saját hibakód kerül följegyzésre.
A C résszel kezdetét veszi a tényleges adatbeolvasás (persze, ha a megnyitás sikeres volt). Elsőként az adatok mennyiségét meghatározó számadat került beolvasásra, amellyel szemben elvárásokat fogalmaztunk meg. Az olvasás fizikai kivitelezhetőségének és a logikai elvárás ellenőrzése után következik a D részbeli „tömeg-adat” beolvasása. A C részben ez esetben nem különböztetjük meg a logikai és a fizikai hibát.
A D részben érzékelem akár a fájlon túli, akár a fizikai hibát. Most nincsen semmi logikai feltétel az adatelemekkel szemben. Vegyük észre, hogy a D-beli ciklus akkor is végig lefut, ha hiba következett be. Természetesen a For ciklus While-lal helyettesítésével a fölösleges végrehajtás megszüntethető lenne, de fontosabbnak tartottam a tervezési logikát követni, mint a kivételkezelés miatt azt módosítani. Ha tetszik: a végrehajtási logikát a hibakezelés miatt csak a minimálisan szükséges mértékben módosítottam.
Az E részben a fájl lezárására kerül sor. Az F a hibakezelő farok, amely feladata a hiba esetleges bekövetkezésekor elvégzendő tevékenységek megszervezése.
Összefoglalásul két dolog kiemelendő.
1. A kivételkezelés nélküli nyelvekben ilyen funkciók beleerőltetése a programba –sajnálatos módon– csak a program logikáját is érintően lehetséges. Ennek során nyert kódban roppant nehéz felfedezni a lényegi (tervezéskor kapott) szerkezetet. Így az esetleges hibakeresés a szokásosnál is körülményesebbé válik.
2. Ha szükséges a kivételkezelés megvalósítása, akkor nagyjából a következő módon végezhető el:
a. alprogramonként célszerű egy, csak a hibakódot raktározó változót deklarálni (elkerülendő az esetleges interferencia);
b. ezt a változót az alprogram elején hibátlanságot jelző állapotba kell hozni;
c. minden olyan helyen, ahol hiba következhet be ellenőrizni kell, s a további kódrész egy hibavizsgálattól függő elágazásba kerül (itt bonyolódik a struktúra);
d. az alprogram egy „farokrésszel” zárul, amelyben az elkövethető hibák szerinti kapcsolóban az ilyenkor elvégzendő tevékenységeket hajtjuk végre.
Egy gondolat a d. ponthoz: mivel e tevékenységek egy része (talán nagy része) „sablonos” tevékenységeket jelent, célszerű ezekhez előre elkészíteni egy vagy több eljárást. A fenti példában a Hibakezelés eljárás ilyen univerzális alprogram:
Procedure HibaKezeles(s:String; kod:Byte;
megall:Boolean);
Begin
Writeln(s);
If megall then
Begin
Halt(kod);
End; {If megall}
ReadKey
End; {HibaKezeles}
Feladata: egy paraméterként megadott szöveg megjelenítése a képernyőn, és vagy megállni egy paraméterben szabályozott kóddal –ha lehetetlen a futás folytatása–, vagy visszatérni.
A kódba bekerült fájlnyitó és hibakezelő eljárások –és velük kapcsolatos fogalmak– önálló programfájlban elkülöníthetők, és igény szerint bármikor –újra megírás nélkül– beépíthető a kódba.