
A mellékelt példa fordítása után a MyException osztálykönyvtár .DLL állományát be kell másolni a .NET osztálykönyvtárait is tartalmazó rendszermappába, mely alapértelmezésben a „%systemroot%:\winnt\Microsoft.NET\Framework\%verziószám%„ helyen található.
A Visual Studio.NET fejlesztőrendszer igen nagy precizitással kidolgozott hibakereső mechanizmusa kiegészült egy olyan funkcióval, amely a fejlesztők kezébe adja annak eldöntését, hogy az alkalmazásban keletkezett kivételes állapotokat a rendszer hibakereséskor milyen módon kezelje. Ez azt jelenti, hogy a fejlesztő egyéni hibakezelési módot rendelhet a kivételek osztály-csoportjaihoz, vagy akár minden egyes osztályhoz.
A funkció eléréséhez a keretrendszer Debug menüpontja alatt megtalálható Exceptions almenüpontra kell kattintani, melynek eredményeként felbukkan egy Exceptions fejléccel rendelkező ablak, ahol a fent említett utasítások kiadhatók.
Az ablak fa-struktúrájában jelenik meg az a négy kivétel csoport, mely a különböző alkalmazások futása során esetleg bekövetkező kivételes állapotokat tartalmazza.
A C++ Exceptions kategóriába természetesen a C++ nyelven megírt alkalmazások kivételei tartoznak, többek közt a MFC osztálykönyvtár CException ősosztály által implementált kivételek. A Native Run-Time Checks és a Win32 Exceptions kategóriákba a futási idejű, memóriafoglalásokkal összefüggő, illetve az operációs rendszer által generált kivételeket találjuk meg nevesítve.
A negyedik csoportot feltárva, vagyis a Common Language Runtime Exceptions csomópontot kibontva egyértelműen szembetűnik, hogy ide tartoznak a .NET Class Library névtereibe tartozó, különböző osztályú kivétel elemek. A rendező elv, vagyis a névtérbe tartozás itt is nyomon követhető, a fán valamennyi kivétel-osztály fellelhető. Az egyes kivételek nevei előtt kis piktogramokat láthatunk, melyek – ahogy később azt látni fogjuk – mind alakjukban, mind színükben igazodnak a fejlesztő által eszközölt beállításokhoz. De lássuk, mik is lehetnek ezek a beállítások.
A felületen a fa-struktúra alatt két rádiógomb csoportot láthatunk, melyekkel elvégezhetjük a testre szabást, vagyis az adott kivételt kijelölve és a megfelelő rádiógombra kattintva meghatározhatjuk az ehhez kapcsolódó viselkedést. Mindkét rádiógomb csoportban azonos műveletek végezhetők el, illetve adhatók meg, csak ezek elvégzése más időpillanathoz kapcsolódik. A csoportok műveleteinek mindegyikére igaz, hogy csak az adott kivétel esetén használható művelet látható, a többi művelet letiltott állapotban van.
A ’When the exception is thrown’ csoportban található rádiógombok segítségével megadott műveletek – melyek csak egy kivétel-individuumhoz és nem egy csoporthoz kapcsolhatók, - akkor következnek be, vagyis a futtatórendszer akkor végzi el azokat, amikor az ily módon megjelölt kivétel bekövetkezik (dobódik), de még mielőtt a program kódjában elhelyezett kivételkezelő (try-catch-finally) kódrészletnek lehetősége volna kezelni azt.
Az ’If the exception is not handled’ csoportban megtalálható rádiógombok segítségével magadott műveletek akkor következnek be, amikor a dobott kivételt a programban megvalósított kivételkezelő megpróbálta kezelni, ez azonban kudarccal végződött, és a művelet sikertelenül véget ért.
A két művelet csoportba tartozó három művelet a következő:
A megoldást választva gondoskodunk a kivétel normális kezeléséről, vagyis arról, hogy DEBUG-olva alkalmazásunkat a kivétel keletkezésekor hibaüzenet jelenik meg, mely közli a hiba előfordulását, valamint helyét.
Ilyenkor a fejlesztő feladata kezelni a hibát, elkapni a kivételt. Ezt a műveletet választva a kivétel csomópontja mellett egy piros kör jelenik meg egy ’x’ jellel a közepén.
A műveletet választva utasíthatjuk a futtatórendszert, hogy mindennemű jelzés nélkül ugorja át a kivételt generáló kódsort, és folytassa a hibakereső művelet végrehajtását, mintha nem is történt volna semmi. A kivétel neve mellett az alapértelmezett szürke gömb megnagyobbodik, ha ezt a műveletet választjuk.
A művelet egy olyan beállítást jelent, melyben a futtatórendszer a kivétel osztályának ősosztálya esetén megtett beállításokat veszi figyelembe, vagyis ezeket a beállításokat örökíti át a gyermek kivételre. Ekkor a szürke gömb mérete lecsökken.
A felület Find gombjára kattintva lehetővé válik, hogy a kivételre nevével hivatkozva megkeressük azt a fa-szerkezetben, amennyiben nem tudjuk pontosan, hogy milyen névtérbe tartozik.
A rendszer lehetőséget ad arra is, hogy a fejlesztő az általa deklarált kivétel osztályt is felvehesse erre a listára, és a fent említett kezelőmetódusokat arra is kiterjessze. Ehhez a felület Add gombjára kell kattintani, és a megjelenő ablakban meg kell adni a kivétel osztály nevét. A funkció csak önálló .DLL-ben megvalósított kivétel osztályokra vehető igénybe, a futtatható kódot tartalmazó állományban elhelyezett deklarációra nem.
A mellékelt osztályban modelleztük a keretrendszer utóbb említett lehetőségét. Az alkalmazás mappájának MyException alkönyvtárában elhelyeztünk egy osztály-könyvtár implementációt, melyet lefordítva egy .DLL-t kapunk, benne egy MyException nevű osztály deklarációjával. A létrehozott osztály az ApplicationException osztályból származik, konstruktorának paraméterében kell megadni létrehozáskor a megjelenő hibaüzenet szövegét.
public class MyException : ApplicationException
{
public MyException(string msg):base(msg)
{
}
}
A felületen található ’Delete’ gombbal törölhetők a létrehozott bejegyzések, valamint a ’Clear All’ gombbal a beállítások visszarendezhetők alapértelmezett értékeikre.
Az alkalmazás futtatásakor a felületen található két gombbal válthatunk ki kétféle kivételes állapotot. A kivételeket nem kezeljük, hogy DEBUG módban tesztelhessük a futtatórendszer viselkedését. Az egyik kivételes állapot System.IO.FileNotFoundException, míg a másik MyException típusú. Azt tapasztalhatjuk, hogy a ’Continue’ rádiógombot választva a művelet-csoportokban, a hibakereső átsiklik a kivételt generáló kódsorokon, majd több művelet nem lévén egy-egy gomb kezelőfüggvényében, a rendszer visszatér szerkesztőmódba, és a hibakeresés véget ér.
A ’Break into debugger’ műveletnél viszont a szokásos módon megjelenik az üzenetpanel a tájékoztató szöveggel, mindkét kivételes állapot bekövetkezésekor. A rendszer akkor tudja figyelembe venni az Exceptions dialógusablakban megadott osztályunkat, ha annak DLL-állománya megtalálható a .NET-állományok mappájában, a fent említett helyen. A műveletek nem működnek ellenkező esetben.