Alternatívák I.
Amennyiben valamely alprogram futás közben olyan szituációhoz ér, amelyben nem képes végrehajtani a feladatát, úgy a kivétel generálásán kívül más módon is jelezheti az őt hívó programrésznek ezt.
Egyik mód, hogy hibakódot ad vissza. Pl.:
public int AdatokMentese( string fileNev )
{
...
if ( ... ) return 1; // file megnyitás sikertelen
...
if ( ... ) return 2; // a háttértároló megtelt
...
if ( ... ) return 3; // egyéb hiba
...
return 0; // egyébként sikeres tárolás jelentése
}
Ez a módszer néha nehezen alkalmazható, pl. a négyzetgyökvonás művelet nem végrehajtható, negatív számnak nincs valós négyzetgyöke. De hogyan adjon vissza hibakódot ekkor a függvény, hiszen amúgy is ad vissza értéket...
A kivétel a programhiba szabványos alakja. Amennyiben a program egyik pontján valamely kivétel képződik, úgy a program futása megszakad, a program maradék sorai nem hajtódnak végre, hanem az alprogram hívási láncon visszafele haladva a program elkezdi saját magát visszabontani.
Ezen visszabontás egészen a Main() függvényig folytatódhat, sőt, maga a Main() függvény is kiléphet a programhiba miatt. Ekkor azt mondjuk, hogy a program leáll a futás közben keletkezett hiba (kivétel) miatt.
A visszabontást azonban megállíthatja, ha egy hibakezelő rész a keletkezett hibát feldolgozza. A hibakezelő részt a programozónak kell a program szövegébe bele építenie (try… catch… blokk).
Alternatívák II.
Amennyiben valamely alprogram futás közben olyan szituációhoz ér, amelyben nem képes végrehajtani a feladatát, úgy a kivétel generálásán kívül más módon is jelezheti az őt hívó programrésznek ezt.
Lehetséges mód, hogy a függvény a hibakódját egy külső, közös változóba helyezi el, ahonnan az őt hívó programkód a hívás végén kiolvashatja azt:
public double Sqrt( double x )
{
if ( x<0 )
{
sqrtHibaKod = 1;
return 0;
}
else
{
sqrtHibaKod = 0;
double Z = az X négyzetgyöke ... kiszámítva ...
return Z;
}
}
Ez a módszer nehézkes. A programozónak meg kell jegyeznie, hogy melyik függvény melyik változóba teszi a hibakódját, és a sok hibakód-változó sok memóriát köt le.
Erre megoldást jelenthet a közös hibakód-változók használata. De ekkor pedig az egyik függvény által elhelyezett hibakód törölheti az előtte lévő hibakódot.
A program állapotai
A program induláskor normál végrehajtási állapotban van. Ebben az állapotban a program végrehajtása zajlik, utasításról utasításra haladva.
Amennyiben valamilyen ok miatt futási hiba következik (pl. nullával való osztás, a fájl megnyitása sikertelen, memória elfogy, stb.) akkor keletkezik egy kivétel, amely leírja a hiba körülményeit és okait.
A kivétel keletkezésekor a program áttér ’hiba’ állapotra. Ebben az állapotban a program futása a hagyományos értelemben leáll, az utasítások végrehajtása helyett azok átlépése következik. A függvény végének elérésekor (}) a függvény visszatér a hívás helyére.
Kezeletlen kivétel
Amennyiben valamilyen ok miatt futási hiba következik (pl. nullával való osztás, a fájl megnyitása sikertelen, memória elfogy, stb.) akkor keletkezik egy kivétel, amely leírja a hiba körülményeit és okait.
Ebben az állapotban a program hagyományos utasításai már többet nem hajtódnak végre, a függvény hívási láncon a program elkezd visszatérni a hívás helyére.
Amennyiben ezen állapotból nem zökken ki a program, úgy a Main() függvény végét is eléri ebben a formában, és az a program futásának teljes megszakadását jelenti.
A program ebben az állapotban csak a catch utasítást ismeri fel, és hajlandó végrehajtani. Tehát csak egy catch állíthatja meg ezt a folyamatot.
A kivétel részei
A kivétel az Exception osztályból (vagy valamely származtatott osztályból) készített példány. Maga az osztály típusa utal a hiba típusára (pl. OutOfRange, DivideByZero, stb.) A példány azonban tartalmaz mezőket is, melyek további információkat hordozhatnak.
Például minden példány hordoz egy Message mezőt magában, melynek akkor van szerepe, amikor a keletkezett kivételt semmi sem állítja meg, és ez a program leállásához vezet. Ekkor ezt az üzenetet az operációs rendszer meg tudja jeleníteni, hogy a felhasználót tájékoztathassa a váratlan leállás okáról.
Speciális hibák esetén további mezők tájékoztathatnak a részletekről. Ezek segíthetnek a hiba feldolgozásában, kezelésében, a reagálásban. De a további mezőkről, azok lehetséges értékeiről a konkrét speciálisabb hibatípusnál kell tájékozódni.