Informatikai gyakorlatok 11. évfolyam Kivételek kezelése, ellenőrzött adatbevitel Czigléczky Gábor 2009 TÁMOP 2.2.3-07/1-2F-2008-0011
Kivételek (1.) Egy hibátlannak tűnő programot is „ki lehet akasztani”. Kivételről akkor beszélünk, amikor váratlan, előre nem látható hiba történik a programban. Ilyen hiba lehet: programozási (szemantikai hiba), vagy hardveres (például nem írható vagy olvasható egy fájl), vagy szoftveres (például nem megfelelő formátumú adatbevitel vagy bemenő fájl, nullával osztás).
Kivételek (2.) Tipikus kivételek (ld. előző egység): NullReferenceException: Az objektumhivatkozás nincs beállítva semmilyen objektumpéldányra. (Egy objektumot deklaráltunk, de még nem hoztuk létre a memóriában. ) ObjectDisposedException: Nem lehet bezárt TextReader objektumból olvasni. (Bezárt fájlból próbáltunk olvasni.)
Kivételek (3.) Tipikus kivételek (ld. előző egység): FormatException: Nem megfelelő a bemeneti karakterlánc formátuma. (Ez a leggyakoribb hiba, rossz formátumú adatot olvas be a program, és nem tudja átkonvertálni adott típusúra.) IndexOutOfRangeException : Az index a tömb határain kívülre mutatott. (Programozási hiba, rosszul indexelünk egy tömböt.)
Kivételek (4.) Gyakori kivétel még: DivideByZeroException: Kísérlet történt nullával való osztásra. (Csak egész számok osztásakor fordulhat elő.) A kivételkezelés módja, hogy a „veszélyes” utasításokat egy kivételkezelő blokkba zárjuk, ami megpróbálja „elkapni” a dobott kivételeket. Így az esetlegesen bekövetkező hibajelenségeket biztonságosan le tudjuk kezelni.
Kivételek kezelése try { // problémás utasítások } catch (kivételtípus1) // hibaüzenet vagy hibajavítás catch (kivételtípus2) … finally // olyan utasítások, amiknek még kivétel esetén is le kell futnia, nem kötelező
Példa: nullával osztás kezelése try { int x = int.Parse(textBox1.Text); int y = int.Parse(textBox2.Text); int z = x / y; } catch (DivideByZeroException) MessageBox.Show("Nullával nem oszthatunk!");
Általános kivétel kezelése Több kivételt is kezelhetünk (lehet több catch blokk is) A módszer hátránya, hogy csak megadott kivételeket tudunk elkapni, nem tudunk mindenre felkészülni Általános kivételkezelés (a kivétel típusának specifikálása nélkül): catch { MessageBox.Show("Hiba történt a művelet végrehajtása közben!"); }
Ellenőrzött adatbevitel (1.) Erre akkor van szükség, ha rá akarjuk kényszeríteni a felhasználót, hogy megfelelő értéket írjon be. Például: osztályzat beolvasása esetén csak 1 és 5 közötti értéket fogadunk el. Megvalósítás: hátultesztelő ciklussal do { // adat beolvasása } while (a_beolvasott_érték_rossz);
Ellenőrzött adatbevitel (2.) A módszer csak úgy alkalmazható, ha az adat beolvasását könnyen meg tudjuk ismételni (pl. InputBox feldobásával). Példa: osztályzat beolvasása do { string s = Interaction.InputBox("Kérem a következő osztályzatot:", "Adatbevitel","0",100,100); szam = int.Parse(s); } while (szam<1 || szam>5); Ügyeljünk a helyesen tagadott feltételre! Egészítsük ki kivételkezeléssel is!