Výjimky asi není třeba programátorům představovat. Způsob práce s nimi je v JavaScriptu velmi podobný jako v dnešních objektových programovacích jazycích (C++, Java, C#).
Výjimku vyvoláme pomocí příkazu throw
, za kterým uvedeme hodnotu, kterou chceme jako výjimku předat. V JavaScriptu lze jako výjimku předat libovolnou hodnotu (číslo, řetězec, objekt,...).
Výjimky nejsou kontrolované, takže jejich ošetřování v kódu není povinné (narozdíl třeba od Javy). Pokud není výjimka ošetřena, způsobí okamžitý návrat z funkce a je předána ke zpracování ve funkci nadřazené. Pokud výjimku neošetříme ani tam, postup se opakuje a může dojít až k jejímu "probublání" na hlavní úroveň programu a je zobrazena v JavaScriptové konzoli.
Ošetření výjimky se provede obklopením příkazů, kde může výjimka vzniknout, konstrukcí try {...} catch {...}
, přičemž v catch-bloku vzniklou výjimku ošetříme. Pokud se uvnitř bloku rozhodneme, že výjimku ošetřovat nechceme, můžeme ji pomocí příkazu throw opětovně vyvolat – výjimka se pak dostane o úroveň výš v hierarchii bloků try {...} catch {...}
.
Ukázka vyvolání a odchycení výjimky:
/* Funkce, která s pravděpodobností 50% vyvolá výjimku. */ function causeExceptionSometimes() { if (Math.random() < 0.5) { throw "Výjimka!"; } } try { causeExceptionSometimes(); } catch (e) { // v proměnné e bude objekt výjimky alert("Byla vyvolána výjimka: " + e); }
Příkaz catch v podobě, v jaké jsme ho nyní použili, odchytí všechny výjimky. Někdy je ale potřeba odchytávat jen některé specifické typy. K tomu slouží podmíněný příkaz catch. Jednoduše za název proměnné napíšeme if podmínka a do daného catch-bloku se vstoupí jen tehdy, je-li podmínka splněna. Nejčastější využití podmínky je test, zda je výjimka objekt daného typu.
try { ... // příkaz vyvolávající různé výjimky } catch (e if e instanceof ExceptionType1) { ... // ošetření výjimky typu ExceptionType1 } catch (e if e instanceof ExceptionType2) { ... // ošetření výjimky typu ExceptionType2 } catch (e if e instanceof ExceptionType3) { ... // ošetření výjimky typu ExceptionType3 }
Vyvolání výjimky přeruší tok vykonávání příkazů. Díky tomu se může stát, že se nějaká část kódu, která je za místem vyvolání výjimky, nevykoná. To někdy způsobuje problémy (například pokud selže čtení souboru a ten se kvůli vyvolané výjimce nezavře). Proto v JavaScriptu existuje konstrukce finally {...}
. Kód, který je touto konstrukcí obklopen, se vykoná vždy, nehledě na vyvolané výjimky.
f = openFile("novinky.txt"); try { novinky = readLines(f); } finally { closeFile(f); // zavře soubor i pokud funkce readLines vyvolá výjimku }
Výjimky jako takové jsou součástí normy ECMA 262 Edition 3. Možnost použití více bloků catch příslušejících jednomu příkazu try
a podmíněný příkaz catch
jsou rozšířením této normy. Do JavaScriptu byly výjimky zahrnuty ve verzi 1.5.
Informace o původním dokumentu
- Autor: David Majda