A q programozási nyelv

Kivételkezelés

Védett kiértékelés

A C++-örökségű programozási nyelvek kivételkezelésre try-catch blokkokat használnak. Az elképzelés az, hogy (szinte) bármilyen váratlan esemény, ami bekövetkezik a try blokkban, ne szakítsa meg a végrehajtást. Ehelyett a vezérlés a megfelelő catch-blokkra irányítódik, ahol a kivételt kezelni tudjuk, vagy ha nincs ilyen catch-ünk, akkor a függvény hívójának továbbítjuk a kivételt.

A q valami hasonlót nyújt számunkra, mégpedig egy függvény védett kiértékelését (protected evaluation). Ennek két formája van, attól függően, hogy egyparaméteres függvényt vagy többparaméteres függvényt akarunk védett módon kiértékelni. Mindkét esetben egy rendezett hármast kell megadnunk. Egyparaméteres függvényeknél a kukac (@) jellel jelöljük a védett kiértékelést, míg többparaméteres függvények esetén a pont (.) jelet használjuk ugyanerre a célra. A szintaxis hasonló mind a két esetben:

@[fmon;a;exprfail] .[fmul;Largs;exprfail]

Itt fmon egy egyparaméteres függvény, aminek a paramétere az a, fmul pedig egy többparaméteres függvény, Largs pedig a paramétereinek a listája. Exprfail pedig egy kifejezés. Mindkét formában a függvényt meghívjuk a paramétereivel. Ha nem történik hiba, akkor a védett kiértékelés visszatér a függvény visszatérési értékével. Ha hiba történik, akkor exprfail kiértékelődik, és ő tér vissza. Ha az exprfail is hibát okoz, akkor a védett kiértékelés is hibát okoz.

Ez a módszer különösen hasznos lehet, ha egy felhasználótól érkezett inputot akarunk feldolgozni. A következő kódrészletek példát mutatnak arra, hogyan tudjuk lecserélni a használhatatlan hibaüzeneteket valami beszédesebbre.

Tegyük fel, hogy a felhasználó meg akar adni egy egész q kifejezést. Ezt eltárolhatjuk egy string-ben és odaadhatjuk a value függvénynek. A probléma az, hogyha a felhasználó egy helytelen q kifejezést adott meg, akkor az alkalmazás abortál. Ehelyett használhatunk védett kiértékelést:

s:"6*7" @[value;s;`$"Invalid q expression"] 42
s:"6x7" @[value;s;`$"Invalid q expression"] `Invalid q expression

Hasonlóan szolgáltatja a . a védett kiértékelését a többparaméteres függvényeknek:

x:6 y:7 .[*;(x;y);`$" Invalid args for *"] 42
x:6 y:`7 .[*;(x;y);`$" Invalid args for *"] `Invalid args for *

Saját "kivételt" a szignál operátorral dobhatunk. A szignál "elkapásához" a védett kiértékelés fail kifejezésében megadhatunk egy függvényt, amely a szignál szövegére mint stringre hívódik meg.

x:6 y:`7 .[*;(x;y);{"Error: ",x}] "Error: type"