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

36. ábra

A tananyag a követkkező licenc alá esik: GNU Free Documentation License