HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Exception osztály lehetőségei


Példaprogram letöltése

8211 bájt

Hibakezelésnél kerül előtérbe az Exception osztály, vagy annak valamely leszármazottja. Így ha alkalmazásunkban a hibák lekezelésével is foglalkoznunk kell, akkor nem árt ismerni az Exception osztály lehetőségeit.

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);
        }        
      }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2001 évkönyv 159. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |