Amikor egy try blokkban létrejön valamilyen hiba, akkor a catch blokkban létrehozhatunk egy változót az Exception, vagy az ebből származó osztályból úgy, hogy az tartalmazni fogja a bekövetkezett hiba tulajdonságaira utaló adatokat.
protected void button1_Click (object sender, System.EventArgs e)
{
try
{
int a = 5;
int b = 0;
Ebben a példában egy nullával történő osztást próbálunk meg elvégezni, mely remélhetőleg megviseli programunkat annyira, hogy hiba keletkezzen.
double c = a / b;
Text = c.ToString();
}
A hiba bekövetkezésekor használjuk fel az Exception osztályt.
catch (Exception ex)
{
listBox1.Items.Clear();
Az Exception Message property-éből sztringként kiolvashatjuk a hiba szöveges leírását.
listBox1.Items.Add("Message: " + ex.Message);
A StackTrace property szintén szöveges formában arról árulkodik, hogy a bekövetkezett hiba melyik függvényben jött létre, valamint azt is megtudhatjuk, hogy a hiba melyik forráskódban és annak hányadik sorában van, így a javítás már elég könnyen megtörténhet.
listBox1.Items.Add("StackTrace: " + ex.StackTrace);
A TargetSite property MethodBase típusban azt adja tudtunkra, hogy melyik függvényben jött létre a hiba.
listBox1.Items.Add("TargetSite.Name: " + ex.TargetSite.Name);
}
}
Az Exception osztály további érdekes lehetőségeinek vizsgálatához készítsünk egy saját függvényt Func névvel, melyben ismét csak egy nullával történő osztást próbálunk meg végrehajtani.
private void Func()
{
try
{
int a = 5;
int b = 0;
double c = a / b;
Text = c.ToString();
}
catch (DivideByZeroException ex)
{
Amikor e hiba bekövetkezik, akkor ugyanezt lekezeljük egy catch blokkban, de itt egy újabb hibát generáltatunk a throw segítségével. Az újabb hibához most viszont egy saját hibakezelő osztályt használunk fel, melyet a Class1.cs-ben hoztunk létre MyException névvel. Ennek konstruktorának három paramétert adunk át: egy számot, mely mondjuk a hiba kódját tárolja, egy sztringet, mely a hiba leírását adja meg, valamint a létrejött hibakezelő osztályt, melyet most a DivideByZeroException osztályból hoztunk létre és az ex nevű változóba tároltunk el.
throw new MyException(500, "Hiba történt nullával való osztás miatt!", ex);
}
}
Nézzük most mit is tud a MyException.
public class MyException: Exception
{
Ebben az osztályban létrehozunk egy ID nevű csak olvasható property-t, mely az FID változóba tárolja értékét. Ez lesz az a szám, mely a hibakódot tárolja, amit a konstruktor első paramétereként adtunk meg.
private int FID;
public int ID
{
get { return FID; }
}
Az osztály konstruktorában rögtön aktivizáljuk az ős osztálybeli konstruktort, továbbadva számára a második és harmadik paramétert.
Ezt követően az első paraméterben lévő hibakódot eltároljuk a belső változónkba, melyet az osztályon kívülről, majd az ID property-n keresztül lehet elérni.
Végül megadunk egy web linket, ahol további információkkal szolgálhatunk a felhasználónknak egy valós alkalmazás esetén. Ehhez a SetHelpLink függvényt kell meghívni, paraméterként egy tetszőleges sztringet átadva neki. A későbbiekben látjuk ennek felhasználási módját is.
public MyException(int id, string message, Exception innerException): base (message, innerException)
{
FID = id;
HelpLink = "http://www.SoftwareOnline.hu/";
}
}
Térjünk most vissza a Form1.cs-hez és nézzük, hogy a létrehozott Func függvényt miként hívhatjuk meg, illetve a létrejövő hibát miként kezelhetjük az új hibakezelő osztályunk, a MyException segítségével.
Szokás szerint egy try blokkban meghívjuk a Func függvényt, mely feltehetőleg hibát okoz.
protected void button2_Click (object sender, System.EventArgs e)
{
try
{
Func();
}
A hiba kezelését a MyException osztályra bízzuk.
catch (MyException ex)
{
listBox1.Items.Clear();
A Message, StackTrace, TargetSite property-ket már ismerjük, ezek most is ugyanazokat az adatokat szolgáltatják.
listBox1.Items.Add("Message: " + ex.Message);
listBox1.Items.Add("StackTrace: " + ex.StackTrace);
listBox1.Items.Add("TargetSite.Name: " + ex.TargetSite.Name);
A hiba kódját most az ID property-n keresztül kérdezhetjük le, melyről nem szabad megfeledkeznünk, hogy egy saját osztályunk saját property-je, így ez csak a MyException-ben létezik.
listBox1.Items.Add("ID: " + ex.ID);
A SetHelpLink függvénnyel beállított sztringet most a HelpLink csak olvasható property-n keresztül tudhatjuk meg és használhatjuk fel.
listBox1.Items.Add("HelpLink: " + ex.HelpLink);
Ha figyelmesen követtük az eddigieket, akkor emlékezhetünk arra, hogy a Func osztályban létrejövő nullával történő osztási hiba lekezelését először a DivideByZeroException hibakezelő osztállyal végeztük, majd a throw segítségével aktivizáltuk a saját MyException hibakezelő osztályunkat. Vagyis két egymásba ágyazott hibakezelésről van most szó. Ilyen esetekre való az InnerException property, melyet használva elérhetjük a belső hibakezelő osztályt is, jelen esetben a DivideByZeroException-t. Mivel ezt Exception típusban kapjuk meg, így bármilyen további tulajdonságát is elérhetjük.
listBox1.Items.Add("InnerException: " + ex.InnerException.GetType().Name);
listBox1.Items.Add("InnerException.Message: " + ex.InnerException.Message);
}
}