A kivételt például gyakran az okozza, hogy valamely művelet végrehajtása meghiúsul (például hibás argumentumok vagy erőforráshiány miatt). Ezt hibának nevezzük.
A Tcl azonban nem csak a hibakezelésre veti be a kivételeket, hanem
vezérlésátadások megvalósítására is. Egy kivétel kiváltása bújik meg
például amögött, ahogyan a continue paranccsal a
ciklusmagot megszakítjuk. Akármilyen mély vezérlőszerkezeti
struktúrába is legyen ágyazva, a continue által kiváltott
kivétel sorra megszakítja a vezérlőszerkezeti parancsok végrehajtását,
és eljut a ciklust megvalósító parancsig, amely elfogja és
értelmezi.
A Tcl parancsok a string típusú visszatérési érték mellett egy
közvetlenül nem hozzáférhető befejezési kódot is visszaadnak.
A parancs normális befejezését a nulla (TCL_OK),
a kivétel miatti befejezést nullától különböző kód jelzi.
Amikor egy Tcl script valamely parancsa kivételkóddal tér vissza, a script végrehajtása megszakad, és a script továbbadja a parancs visszatérési értékét és a kivételkódját az ő végrehajtását kezdeményező hatalomnak. Ha a script végrehajtását egy parancs kezdeményezte, a parancs eldönti, hogy lekezeli-e a kivételt. Ha nem kezeli le, akkor a visszatérési értéket és a befejezési kódot átveszi a scripttől. Végül ha a script végrehajtását a felhasználó kezdeményezte (például interaktívan begépelte a Tcl shellnek, vagy a Tcl shell indításakor megadott egy Tcl scriptet tartalmazó fájlt), akkor a Tcl interpreter a kivétel típusának megfelelő hibaüzenetet ír ki.
A kivétel fajtáját a befejezési kód határozza meg.
TCL_ERROR (1)
errorInfo | Tartalma egy többsoros string, amely feltárja, hogy a hiba hol keletkezett, és milyen parancsok és scriptek végrehajtása szakadt meg miatta. A megszakított parancsok töltik fel, ahogyan a hiba kifelé gyűrűzik. |
errorCode | A
hiba okát részletezi egy listában. A lista első eleme adja meg a
hiba kategóriáját. Ha nincsenek részletek, ez az elem
NONE. Ha vannak - például POSIX rendszerhívások
során fellépett hibák esetén, amikoris a lista első eleme POSIX -
akkor a lista további elemei a kategóriától függően tartalmaznak
egyebeket - a POSIX példában ez a POSIX hibakód szimbolikus neve
és egy szöveges leírás (mondjuk ENOENT és "No such
file or directory"). |
TCL_RETURN (2) return parancs idézi elő, a
visszatérési érték a return parancsban megadott, a befoglaló
eljárásnak szánt visszatérési érték. A proc paranccsal
létrehozott, az eljárástörzset meghívó parancs kezeli le azzal, hogy
normálisan befejeződik, és visszaadja a TCL_RETURN
mellett érkező visszatérési értéket.
TCL_BREAK (3) break parancs váltja ki.
Normális esetben a legbelső befoglaló ciklus parancs kezeli le, és
befejezi a ciklus végrehajtását. De elfogják a proc paranccsal
létrhozott parancsok és a source parancs is, és
hiba típusú kivételként terjesztik tovább, ezzel diagnosztizálva a
break parancs ciklustörzsön kívüli használatát.
TCL_CONTINUE (4) continue parancs váltja
ki. Normális esetben a legbelső befoglaló ciklus parancs kezeli le,
és folytatja a ciklus végrehajtását a következő iterációval. De
elfogják a proc
paranccsal léterhozott parancsok és a source parancs is, és
hiba típusú kivételként terjesztik tovább, ezzel diagnosztizálva a
continue parancs ciklustörzsön kívüli használatát.
error hibaüzenet ?hely? ?ok?Az
error parancs TCL_ERROR kivételt vált ki,
amelyhez a megadott hibaüzenetet mellékeli.
Ha a hely argumentum hiányzik, vagy üres string, az
errorInfo változó első sorai dokumentálják, hogy
error parancs okozta a kivételt. Ha a hely
argumentum nem üres string, akkor az errorInfo változó vele
inicializálódik, és nem említi az error parancsot.
Utóbbinak akkor van jelentősége, amikor elfogtunk egy kivételt,
részben kezeltük, de úgy szeretnénk továbbterjeszteni, hogy a hiba
fellépésének eredeti helyét jelöljük meg. Ilyen esetben ugyanis az
errorInfo változó már tartalmazza a kivétel terjedésének
útvonalát az elfogásig, ezt megadva az error parancs
hely argumentumaként a kívánt hatást érjük el.
Az ok argumentumot az error parancs értékül
adja az errorCode változónak. Ha nem szerepel, az
errorCode változó értéke NONE lesz.
return ?-code befejezési kód? ?-errorinfo hely? ?-errorcode ok? ?érték?A
return parancs a legbelső befoglaló eljárás vagy source paranccsal
meghívott script végrehajtásának befejezését eredményezi. A
parancsban megadható a visszatérési érték (alapértelmezésben üres
string) és a befejezési kód (alapértelmezésben nulla). A befejezési
kódot a ok, error, return,
break és continue stringek valamelyikével,
vagy egész számmal jelölhetjük.
Az -errorinfo és -errorcode opcióban
megadottakat a return parancs csak akkor veszi
figyelembe, ha a befejezési kód TCL_ERROR. Ilyenkor a
hely stringet értékül adja az errorInfo
változónak, az ok listát pedig az
errorCode-nak. Hely alapértelmezésben üres
string, ok pedig NONE.
Felvetődhet valakiben a kérdés, hogy a Tcl hogyan választja szét azt a
befejezési kódot, amelyet a return parancs ad vissza,
hogy a kivétel hatására az eljárásnak adódjon át a vezérlés, és azt a
befejezési kódot, amit ezek után maga az eljárás ad vissza. Sem a
rendelkezésemre álló dokumentáció, de még kísérletezés útján sem
sikerült erre választ kapnom. A Tcl forráskódjából megtudható, hogy a
TCL_RETURN kivétel mellett a másik kód az interpreter
állapotát reprezentáló C struktúrának egy mezőjében (tehát Tcl-ből
hozzáférhetetlenül) utazik az eljárástörzsig.
catch script ?változónév?
A catch parancs végrehajtja a megadott scriptet, és
minden kivételt elfog. Visszatérési értéke a script befejezési
kódja, azaz nulla, ha a script végrehajtása normálisan fejeződött be,
és nullától különböző, ha futása kivétel miatt szakadt meg.
Ha megadjuk egy változó nevét is, a catch parancs abban
helyezi el a script visszatérési értékét, vagyis az eredményt vagy a
hibaüzenetet.
A return utasításnál taglalt kérdéshez kapcsolódik, hogy
a catch parancs TCL_RETURN eredménnyel tér
vissza, ha a scriptben, eljáráshíváson kívül return
utasítást adunk ki. A return utasításban megadott
befejezési kódhoz így sem tudunk hozzáférni.