A Nemerle programozási nyelv

Kivételkezelés



Kivételkezelés

A kivételkezelés Nemerlében teljesen hasonlóan működik, mint C#-ban. Az egyetlen lényeges eltérés, hogy a kivételkezelő ágak leírásának szintaxisa a mintaillesztéshez hasonlít.

A throw utasítás

Kivétel kiváltására a throw utasítást kell használni.

throw ArgumentException();

Ennek paraméter nélküli változata a kivételkezelő ágakban használható arra, hogy a kivételt újra kiváltsuk, vagyis továbbterjesszük a hívási lánc mentén.

throw;

A try... catch... finally szerkezet

A kivételkezeléshez tehát a megszokott try, catch, finally hármas használható. Szintaxisa:

try { ... } catch { | e is AException => ... | e is BException when e.Reason == Reason.SomeReason => ... | _ => ... } finally { ... }

A try blokkban azok az utasítások szerepelnek, melyeknek a kivételeit valamilyen módon le szeretnénk kezelni. Ha valamelyik utasítás végrehajtása során kivétel váltódik ki, a blokk végrehajtása megszakad és a vezérlés a catch, ill. finally blokkoknak megfelelően folytatódik.

A catch és finally blokkok közül legfeljebb az egyik elhagyható.

A catch blokk tartalmazza a kivételkezelő ágakat, mintaillesztés-szerű szintaxissal leírva. Kétféle "mintaillesztés" alkalmazható: típusillesztés, ill. a mindenre illeszkedő minta.
Típusillesztés esetén akkor illeszkedik a kivétel a mintához, ha a kivétel típusa megegyezik a megadott típussal, vagy annak egy altípusával. Az illesztéshez őrfeltételt is megadhatunk a when kulcsszó után, ezek a kivétel objektumra (például annak attribútumértékeire) tesznek további megszorításokat. Az "_" jel a mindenre illeszkedő minta, nevének megfelelően tetszőleges kivételre illeszkedik.

A kivételkezelő ágak sorrendje lényeges, mivel kivétel fellépése esetén az első illeszkedő ág kódja fog lefutni. Így értelemszerűen a mindenre illeszkedő minta csak az utolsó ág lehet, ill. a specfikusabb kivételosztályok megelőzik az álatalánosabbakat.

A finally blokk minden esetben végrehajtásra kerül, akár lépett fel kivétel, akár nem. Így ideális clean-up kód elhelyezésére, például egy fájl objektum lezárására. A Nemerlében is érvényes "szabály", hogy ebben a blokkban kerülendő az olyan kód megadása, amely újabb kivételt válthat ki.

Ha egyik kivételkezelő ág sem illeszkedik a fellépő kivételre (vagy hiányzik a catch blokk), akkor a kivétel továbbterjed a hívási lánc mentén. (Természetesen csak azután, hogy a finally blokk végrehajtásra került.)