Sfairadora

  • Referenční příručka

Zpracování chyb

Pokud během vyhodnocování funkce zapsané v jazyce Enki dojde k chybě, v běžném případě je ukončen běh funkce a chyba je zobrazena uživateli – buď v okně s hlášením o chybě, nebo u ovládacího prvku jako červený čtvereček (podrobnosti o chybě lze potom zobrazit v kontextové nabídce). Pokud je to žádoucí, lze toto chování změnit a vzniklou chybu zpracovat ve funkci, kde vznikla, takže nebude zobrazena uživateli.

Typ Error

Aby bylo možné zobrazovat přesnou diagnostiku chyby a zároveň umožněno zpracování chyb v jazyce Enki, definuje Sfairadora datový typ Error, který zachycuje informace o chybě. Typ Error v sobě nese tyto informace:
kategorie chyby
identifikuje v obecnosti původ chyby. Jsou definovány následující možnosti:
systémová chyba
chyba pocházející z operačního systému (jako chyba při práci se souborem a pod).
syntaktická chyba
chyba v zápisu funkce Enki nebo šablony Enkidu.
výpočetní chyba
chyba při vyhodnocování funkce.
chyba dat
chyba při manipulaci s daty (neexistující datová položka a pod).
uživatelská chyba
chybu, kterou definuje uživatel při vytváření funkce v jazyce Enki.
kód chyby
kód, který umožňuje přesně identifikovat původ chyby.
slovní popis chyby
popis chyby zobrazovaný uživateli.
reference na data
reference na data, k nimž se chyba váže. Pokud jde například o syntaktickou nebo výpočetní chybu, obsahuje referenci na zdrojový text funkce, spolu s řádkem a sloupcem, na kterém se chyba vyskytla. Chyba dat touto informací identifikuje datovou položku, která chybu způsobila. U uživatelské chyby je za nastavení reference dat zodpovědný uživatel.
příčina chyby
V praxi často vede chyba na nejnižší úrovni k nemožnosti dokončit operaci na vyšší úrovni, tedy i tato vyšší úroveň zpracování skončí chybou (a tak dále). Aby bylo možné chybu řešit na adekvátní úrovni, zahrne chyba na vyšší úrovni do svého popisu chybu na nižší úrovni, která ji zapříčinila, jako svoji příčinu. Uživateli jsou potom zobrazeny popisy chyb na všech úrovních spolu s odpovídajícími referencemi na data. Uživatel pak může lépe posoudit, proč chyba vznikla.

Nestriktní hodnoty

Všechny konstrukce jazyka Enki jsou v zásadě operátory, které berou jako vstupy hodnoty vrácené podřízenými operátory a samy vždy vracejí hodnotu nadřazenému operátoru. Funkce v jazyce Enki má tedy vždy podobu jediného výrazu, který se hierarchicky skládá z podřízených výrazů. Pokud vznikne na nějaké úrovni vyhodnocování takového výrazu chyba, chápe se to tak, že místo regulérní hodnoty je výslednou hodnotou hodnota typu Error. Pokud má některý operátor tu povahu, že při jeho vyhodnocování může vzniknout chyba, typu jeho výsledku se říká nestriktní hodnota. Nestriktní hodnota je tedy takový datový typ, který připouští kromě běžných dat i hodnotu typu Error. Opakem je striktní hodnota – tedy taková, kde se chyba nepřipouští.
Pokud při vyhodnocování operátoru došlo k chybě a nadřazený operátor požaduje jako svůj parametr striktní hodnotu (tj. není schopen pracovat se vstupní hodnotou typu Error), předá se stejná chyba jeho nadřazenému operátoru, jako by tato chyba byla i jeho výsledkem. Tímto způsobem je chyba propagována nahoru po hierarchii operátorů výrazu buď k nějakému operátoru, který připouští nestriktní hodnotu jako svůj parametr, nebo je chyba předána jako výsledek celé funkce.
Pro zpracování chyb je definována sada standardních funkcí, které akceptují nestriktní hodnoty. Uživatel má navíc v případě potřeby možnost definovat svoje vlastní funkce akceptující nestriktní hodnoty – viz definice funkcí v sekci dokumentu Definice případně v poskytovateli dat.

Standardní způsoby zpracování chyb

První metodou zpracování chyb je operátor
try blok1
resp.
try blok1 else blok2
V obou případech se vyhodnotí blok1 a pokud jeho výsledkem není chyba, vrátí jeho hodnotu i operátor try. Pokud nastala chyba, verze bez větve else vrátí iniciální hodnotu typu, který by vrátil blok1, kdyby neskončil chybou. Verze s větví else vyhodnotí blok2 a výsledkem je potom výsledek bloku2 ve větvi else. Ve větvi else je vždy definován zvláštní symbol last_error, jehož hodnotou je chyba, která nastala. Tuto hodnotu lze buď analyzovat a podle ní provést opravu chyby, nebo jí lze zapouzdřit do nadřazené chyby a tu pak vrátit jako výsledek operátoru try.
Příklad 1:
x = try a/b else 0
do proměnné x se přiřadí podíl a/b, pokud by však došlo k chybě (např. dělení nulou), přiřadí se 0.
Příklad 2:
try
(
var File f;
f <- open("info.txt");
var String line = read_line(f);
...
)
else
(
error("nelze načíst soubor 'info.txt'", last_error);
)
Pokud nastane chyba při načítání ze souboru, vytvoří se popis chyby, vysvětlující situaci na vyšší úrovni a připojí se jako její příčina systémová chyba uložená v last_error.
Druhou metodou je přiřadit výsledek do nestriktní proměnné a potom otestovat, zda nejde o chybu.
Příklad:
var Real ?x = a/b;
if(is_error(x))
x = 0;
výsledek podílu a/b se přiřadí do proměnné x a to i v případě, že jde o chybu (nestriktní proměnná se vytvoří užitím otazníku před názvem v definici proměnné). Následně se otestuje, zda nejde o chybu a případně se přiřadí do proměnné nula.
Všechny funkce pro manipulaci s chybami jsou popsány v kapitole Funkce pro práci s chybami.