A Cobra programozási nyelv

Kivételkezelés



Szintaxis

A Cobra nyelvben a throw exception és az assert condition szintaxisú utasításokkal dobhatunk kivételt, míg a dobott kivételek kezelését a try-catch-success-finally szintaxisú utasítás-kombinációval valósíthatjuk meg.

try loc = 1 count = 1 catch (/ catch (e as) Exception) loc = 2 count += 1 success #akkor hajtódik végre, amikor nem volt kivétel loc = 3 count += 1 finally #mindig végrehajtódik loc = 4 count += 1 assert loc==4 assert count==3

Debuggolási célból, a unit testek írásának megsegítésére hozták létre az expect utasítást, mely akkor dob kivételt, ha az adott kódblokkban nem történt kivétel vagy az elvárttól különböző kivétel váltódott ki. Ekkor egy úgynevezett ExpectException dobódik. Abban az esetben érdemes ezt a szolgáltatást alkalmazni, amikor unit testeket írunk olyan függvényekhez, amelyekről tudjuk, hogy bizonyos körülmények között kivételt dobhatnak.
expect IndexException t = [1, 2] x = t[2]

Kivételek kiváltása

A helyességbizonyító eszközöknél bővebben is tárgyalt assert utasítás segítségével dobhatunk kivételeket egy logikai feltétel aktuális értékétől függően. Kivételeket a throw utasítással explicit módon is kiválthatunk: a dobni kívánt kivétel objektumot -megfelelő felparaméterezés után- a throw után írva.

Kivételek kezelése

Kivételek kezelésére alkalmas a hagyományos try-catch blokk, de emellett megadhatunk olyan utasításokat is, amelyeket minden esetben szeretnénk végrehajtani a finally kulcsszó után és olyan kódrészletet is írhatunk, melyet csak sikeres lefutás esetén szeretnénk végrehajtatni, ezt az utasítássorozatot a success kulcsszóval kell bevezetni.

Kivételek terjedése

Kivétel dobódásakor az adott utasítássorozat végrehajtása megszakad, és a vezérlés átadódik a kivételkezelő blokkokhoz, ha a kivételhez nem tartozik megfelelő kezelő blokk, a kezeletlen kivétel továbbterjed a következő bennfoglaló blokk irányába, legfeljebb addig, amíg el nem éri a legkülső szintet. A kivétel kezelő blokk utasításainak lefutása után a vezérlés a kezelő blokk szintjén következő utasításokkal folytatódik tovább.

Exception report

A Cobra gondoskodik róla, hogy az esetlegesen felmerülő hibákat a lehető legrövidebb idő alatt detektálhassuk és javíthassuk, erre szolgál a nagyon részletes „post-mortem" exception report, tudósítás a kivétel körülményeiről.
Amikor egy Cobra program egy kezeletlen kivételt dob, egy szöveges, könnyen értelmezhető leírás készül a program aktuális állapotáról és a kivétel jellemzőiről. A leírás tartalmazza a környezet tulajdonságait: a program nevét, a dátumot és a pontos idejét a kivétel kiváltódásának, a parancssori argumentumokat. Emellett a leírásban szerepelnek a kivétel dobás körülményeinek részletei, az objektum-táblázatok és a verem aktuális állapotának részletezett leírása, ha a cobra -detailed-stack-trace vagy a cobra -dst kapcsoló be volt állítva.
A leírás HTML formátumban készül, így segítve a könnyű olvashatóságot és navigációt.
Az exception jellemzőinek részletezésénél szerepel a kivétel pontos helye, a filenévvel és a kódsor számával együtt megadva. Ezen kívül a kivételre alkalmazott .toString eredménye és a kivételhez tartozó üzenet illetve az exception minden attribútuma.
Az assert/require/ensure utasításokkal kiváltott exceptionök esetén szerepel a leírásban a logikai kifejezés szintről-szintre történő kiértékelése, hasonlóan a szintaktikai fához, ezt a technikát expression breakdownnak nevezik.
A reportban szerepel a this értéke, a thishez tartozó objektum táblázat és egyéb kifejezés táblák. A this illetve az expression breakdown egyéb objektumaihoz tartozó objektumtáblák HTML linkekként érhetőek el.
Minden objektumtábla tartalmazza az objektum osztályának nevét, a .toString eredményét és minden attribútumának értékét alfabetikus sorrendben és linkeket is tartalmazhat egyéb objektumtáblákra.
Az objektumhoz tartozó táblázat szerkezete felüldefiniálható, bővíthető, az .extendObjectTable implementálásának segítségével.
A részletes verem leírás tartalmazza minden elem esetében az objektumok szokásos leírását, az argumentumok eredeti értékét emellett a paraméterek és lokális változók utolsó megváltozott értékét. A részletes stack monitorozás azonban lelassíthatja akár 4-szeres mértékben is a programot, így default beállításként ki van kapcsolva a -detailed-stack-frame opció.
Az assert, ensure és require utasítások esetében egy link mutat a megfelelő kódrészletre, melyet a bekonfigurált szövegszerkesztőben nyit meg a program, ha a megfelelő COBRA_EDIT_LINK környezetváltozó be volt állítva.
Interaktív, command line módban az interpreter javaslatokat is tesz a hibák javítására.