A Cecil programozási nyelv

Kivételkezelés

Kivételkezelés

A Cecil standard könyvtára az alábbi három eljárást biztosítja, mint hibakezelő eljárásokat. Bár a standard könyvtár dokumentációja [8] kivételkezelés címszó alatt tárgyalja őket, ezek valójában hibakezelő rutinok.

method handle_system_errors(cl:&():void):bool;
method unwind_protect(cl:&():`T, on_return:&():void):T;
method on_error(cl:&():`T, on_error:&():void):T;

A handle_system_errors egy hiba elrejtő eljárás, amely úgy működik, hogy végrehajtja az argumentumként átadott closure objektumot (azaz az eval metódust ezzel a closure objektummal paraméterezve), és ha a végrehajtás során hiba lép fel, akkor hamis, egyébként pedig igaz értékkel tér vissza.

A második, unwind_protect eljárásnak két closure argumentuma van. Az unwind_protect mindkét closure objektumot mindenképpen végrehajtja, ezzel hasonló funkcionalitást megvalósítva, mint a Common Lisp ugyanilyen nevű, vagy pl. a Delphi try-finally konstrukciója. A visszatérési érték attól függ, hogy az argumentumok végrehajtása hogyan fejeződött be. Az unwind_protect először a cl closure objektumot hajtja végre, majd amikor az befejeződött - függetlenül attól, hogy milyen módon - végrehajtja az on_return closure-t is. Ha mindkét eljárás hiba nélkül lefutott, akkor az unwin_protect visszatérési értéke a cl által visszaadott érték; egyébként a hiba tovább terjed felfelé. Amennyiben az on_return végrehajtása során hiba történik, akkor ez a hiba adódik tovább, felülírva a cl closure eredményét (legyen az rendes visszatérési érték, vagy valamilyen hiba).

Az on_error metódus teljesen hasonlóan működik, mint az unwind_protect, azzal a különbséggel, hogy az on_error második argumentuma csak akkor fut le, ha az első végrehajtása közben hiba lépett fel. Ez a jól ismert try-except konstrukcióra hasonlít (pl. Delphiben), fontos megjegyezni azonban, hogy itt a hibakezelő blokkban nem tudunk a fellépett hibára hivatkozni, így nem tudunk a hiba természetétől függően más és más tevékenységet végezni, ahogy azt a kivételkezelésnél általában megszokott. A megszokott kivételkezeléshez képest fontos különbség még, hogy nem nincsenek felhasználó által definiált kivételek, és a felhasználó maga nem válthat ki kivételt.