A Falcon programozási nyelv

Kivételkezelés

Szintaxis, definiálás

A Falcon egy olyan mechanizmust nyújt, ami kezeli a váratlan szituációkat, melyek felmerülhetnek a programban. Sok könyvtár funkció és nyelv felépítése használja ezt a mechanizmust, hogy kommunikáljon az irányító scripttel a váratlan szituációkról, de az a rendszer maga a script számára is elérhető, így a scriptírók élvezhetik ennek az előnyeit. Ezt nevezik kivétel kiváltásnak.

A Virtual Machine, a könyvtár funkciók egyike vagy akár egyéb script részek mindig egy lehetségesen veszélyes szituációba futnak, egy kivételt váltanak ki. Ha ezt a kivételt nem kezelik le valahogy, a script visszaküldik a rendszernek; a Falcon interpreter kiír egy hibaüzenetet és bezárul.

Ha a Falcon Virtual Machine-t egy beágyazott alkalmazás használja, hogy néhány scriptet futtasson, a beágyazónak van lehetősége, hogy beállítson egy felsőfokú kivétel kezelőt. Ez általában engedélyezi a beágyazott alkalmazásnak a lehetőséget, hogy tudomást szerezzen a fatal error-okról a scriptekben és érezhető lépéseke tegyen.

Létezik a kivételeknek egy olyan beállítása, amit megállíthatatlannak hívnak. Ezek a kivételek a könyvtár funkciókból erednek vagy magából a Virtual Machineból, ha ez valamilyen kritikus állapotot talál, ami meggátolhatja a scriptek működését, mint pl.: script bytecode corruptions. Ezekben az esetekben nem lenne túl bölcs hagyni a scripteknek elkapni a kivételt, így a megállíthatatlan kivételek szükséges ilyenkor. A kivételek kezelhetők használva a try-catch control block-ot:

try [try statements] [ catch [object_type] [ in error_variable] ] [ catch statements ] end

Minden catch block értelmezni tud egy bizonyos fajta változót. A működési alapelv ugyanaz, mint a „select” állítás, egy típus lehet egy a típusnevekből vagy lehet egy a valahol a programban megjelenített szimbólum neve.

A try-catch block-ok lehetnek beágyazottak ( egyet egy másikba helyez) bármely más Falcon block-kal. (if, while, for, function stb..) A try-catch block funkciója a következő: bármikor, amikor egy utasítás a try (try-statements)-en belül egy kivételt képez, az írányítási folyam azonnal megtörik. Egy try.catch block azonnali, vagyis jelen idejű, ha a képzett objetum típusa megegyezik a catch block típusspecifikációjával. Az általános/teljes típusok (mint a StringType vagy ObjectType) elsőbbséget élveznek, aztán specifikus szimbólumok, melyek specifikációit használjuk a sorrend aspektusában, amik a catch ágakban vannak kinyilvánítva. Emiatt a catch block által értelmezett alosztályokat ajánlatos deklarálni azelőtt még, hogy a szülő értelmezve lett volna. Végül a típusozott block-ok közül az egyik megyezeik a kiváltott kivétellel, a kivételkezelőnek adódik át a továbbiakban, ha valós idejűről beszélünk. Ha a típus nélküli catch ág nem jelen idejű, a hiba kiváltódása az alkalmazás szintjéhez igazodik. A következő példa biztosít róla, hogy a felhasználó egy numerikus inputot fog emegadni:

age = 0 while age == 0 print( "Enter your age: > " ) try age = int( input() ) catch printl( "Please, enter a numeric value" ) end end

A catch ág birtokolhat egy lehetésges variációt, ami tartalmazza a kivételt ami a try block által lett kiváltva. A kivétel bármilyen Falcon elem lehet pl.: számok, láncok, objektumok, ami megmutatja, hogy mi volt ppontosan a hibaüzenet állapota. A szabály alapján a Virtual Machine és minden könyvtár funkció csak egy hibaosztályt fognak kiváltani vagy egy az alosztályaiból származnak. Habár, scriptek és más kivétel könyvtárak bármilyen fajta elemet.

Hibák kiváltása

Érdekes dolog hibákat kiváltani ; a kivétel folyamat hirtelen megszakad és a lehetséges hibakezelés segítségül hívja, tehát a hibák kiváltása a scripteken belül gyakran elháríthatják a szükségét az „if” sorozatnak, mindegyik ellenőrzi a helyes dolgok meglétét minden lépésnél. A raise kulcsszó feldob egy elemet és kivételként kezeli. A script választhat 2 különböző beállítást, hogy hibákat váltson ki; az első, ami kreál egy esetet, amikor az Error class az Error() constructor-t használja, ami a következő paramétereket fogadja el:

Error( code, message, comment )

Habár néha hasznos eldobni egy lighter object.et. Tegyük fel, hogy egy max és egy min kort akarunk felállítani a példánkban és így egy hibát hozunk létre, ami akkor váltódik ki, ha azok a limitek nem elfogadhatóak. Ebben az esetben, amit flow control excaption raising-nek hívunk, túlzás lehet. Példa:

age = 0 loop print( "Enter your age: > " ) try age = int( input() ) if age < 3: raise "Sorry, you are too young to type." if age > 150: raise "Sorry, age limit for humans is 150." catch StringType in error printl( error ) // age has been correctly assigned. Change it: age = 0 catch Error in error // it's a standard error of Error class, manage it normally printl( "Oops, you caused the error number ", error.code, "\nwhich means that: ", error.description ) printl( "Please, enter a numeric value" ) catch in error printl( "Something else was raised... but I don't know what..." ) printl( "So I raise it again and the app will die." ) raise error end end age != 0

Egy másik megvalósítása az előző kódrészletnek:

// the rest as before... try age = int( input() ) if age < 3: raise "Sorry you are too young to type." if age > 150: raise "Sorry, age limit for humans is 150." catch in error select error case StringType // manage strings as before case Error // manage Error instances as before... default // print something as before... raise error end end

Látható is, hpgy ez a megoldás sokkal átláthatódd, kompaktabb, és elkülönül jobban a 3 szint.