A ScriptKernel programozási nyelv

Kivételkezelés

Szintaxis

declare
{
exception MyExc;
}
import
{
exception DivisionByZeroException;
}
...
{
...
raise near(MyExc); // ld: 3. szekció: Kivételek kiváltása
...
exception(MyExc)
{
// utasítások
}
exception(DivisionByZeroException)
{
// utasítások
}
exception(...)
{
// utasítások
}
}

Kivételek definiálása

A kivételeket a deklarációjuk definiálja, és a deklarációt a declare blokkba kell elhelyezni.

declare
{
exception név;
}
A standard kivételek a kontextusban vannak deklarálva, ezért ezeket a programoknak importálniuk kell.
import
{
exception DivisionByZeroException;
}
A kontextusban deklarált kivételek:

Kivételek kiváltása

Kivételt a raise "függvénnyel" lehet kiváltani. A szintaxisa miatt nevezem függvénynek, mert a kulcsszó után ( és ) közé kell írni a kiváltandó kivétel azonosítóját. A fenti példában raise near szerepel. A kettő között az a különbség, hogy a raise near nem ugrik ki az aktuális függvényből, hanem a saját kivételkezelőjéhez ugrik (ha nincs saját kivételkezelője, akkor ugyanúgy viselkedik, mint a raise). A raise figyelmen kívül hagyja a saját kivételkezelőjét.

Kivételek kezelése

Függvény-szintű kivételkezelést támogat a nyelv. A kivételkezelő részt a függvény törzsének a végén kell elhelyezni. Egy kivételkezelő az exception kulcsszóval kezdődik, majd gömbölyű zárójelek között a kezelendő kivétel azonosítója, majd kapcsos zárójelek között az utasítások. Nem csak meghatározott kivételt lehet elkapni - erre a célra van egy joker is, amit az utolsó kivételkezelő után kell írni. Ha első helyen szerepelne, akkor elkapná az összes kivételt. A kivételkezelő utasításai után a finally utasításait is végrehajtja. A finally utasításait csak akkor nem hajtja végre, ha kivételt vált ki a függvény, mert akkor megszakad a végrehajtása.

function func()
{
// utasítások
exception(exc_1)
{
// utasítások
}
...
exception(exc_N)
{
// utasítások
}
exception(...)
{
// utasítások
}
finally
{
// utasítások
}
}

Kivételek terjedése

Egy kivétel addíg lép ki a függvényekből, amíg nem talál egy kivételkezelőt, vagy amíg ki nem lép az utolsó függvényből. Utóbbi esetén a virtuális gép jelez a gazda programnak, hogy futási idejű hiba történt (kezeletlen kivétel).
Kivételt lehet kivételkezelőből is kiváltani. A finally utasításait minden esetben végrehajtja!