A kivételkezelés jellemzői
Már megvizsgáltuk, hogyan működik az a fajta kivételkezelési megoldást, ami hibaüzenetet "dob".
A C#-ba sokkal kifinomultabb megoldásokat is beépítettek, hogy segítse a munkáját. A try-catch blokk „elkapja” a kivételt és lehetőséget kínál, a programóznak, hogy maga kezelje a problémát.
Szintaxis:
try
{
utasítások
}
catch (Exception e)
{
//Kivételkezelés
kódja.
System.Console.WriteLine(“Error”+e.toString());
}
A toString() metódus a legtöbb objektum esetén létezik, ami szöveges üzeneté alakítja az objektum kimentét.
Egynél több catch blokkot is lehet implementálni, emellett létezik egy „finally” blokk is, amelynek utasításai kivétel esetén is lefutnak. Ez leginkább a fájlkezelésnél használatos.
try
{utasítások }
catch (Exception)
{ utasítások }
catch (Exception)
{ utasítások }
finally { utasítások
}
Példák:
„Dobjunk” egy általános hibát, amit utána elkapunk majd megjelenítjük a hibaüzenetet.
32. ábra
namespace ConsoleApplication20
{
class Program
{
static void Main(string[]
args)
{
{
try
{
throw
new System.Exception();
}
catch
(System.Exception e)
{
System.Console.WriteLine(e.Message);
}
}
}
}
}
Amit látnunk kell a CTRL+F5 lenyomása után:
33. ábra
Az összes objektum rendelkezik a ToString() metódussal, ami az objektum részletes kiíratását teszi lehetővé. Ennek rövidített verziój a message() metódus, ami csak a szövegparamétert írja ki, míg a ToString() az osztály nevét és a hiba helyét (kódsorszám).
További részletek:
http://hu.wikipedia.org/wiki/Java_programoz%C3%A1si_nyelv#Kiv.C3.A9telkezel.C3.A9s
Gyakori hiba még a nullával való osztás, illetve az, hogy a programozó nagyobb számot akar tárolni a változóban, mint azt a típus megengedi.
Nézzük meg ezeket a hibákat hogyan kezelhetjük C#-ban:
34. ábra
namespace ConsoleApplication21
{
class Program
{
static void Main(string[]
args)
{
{
byte
a = System.Byte.MaxValue;
int
b = 0;
try
{
checked
{
a++;
}
b = a / b;
}
catch
(System.OverflowException e)
{
System.Console.WriteLine(e.ToString());
}
catch
(System.DivideByZeroException f)
{
System.Console.WriteLine(f.Message);
}
finally
{
System.Console.WriteLine("A
finnaly blokk mindenkép lefut :)");
}
}
}
}
}
A byte a = System.Byte.MaxValue;utasítással létrehozunk egy byte típusú változót, és inicializáljuk a maximális értékkel (256).
A checked utasítás (párja: uncheked) blokkjában ha az aritmetikai művelet nem végrehajtható egész számokon, akkor nincs műveletvégrehajtás. Enélkül nem engedélyezné a .NET környezet a maximális érték fölé történő inkremetálási kísérletünket.
A program futása során túlcsordulási kivétel keletkezik, így a nullával való osztásra már rá sem lép. A finally blokk használata többszörös catch blokk után sem kötelező (opcionális), ám itt láthajuk, hogy a finnally blokkba írt szöveg már megjelenik a hiba ellenére is:
35. ábra