Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyAlgoritmizace a programování Programování v JavaScriptu - II Výjímky

Logo Matematická biologie

Výjímky

V modernějších programovacích jazycích se používá pro ošetření chyb v programu tzv. ošetření výjimek. Základní myšenka je postavena na tom, že funkce vrhají (throw) nebo, výjimky (exception). Systém si pak zajistí vyskočení z aktuálního bloku kódu na nejbližší blok pro ošetření výjimky. V systému se nachází také blok kódu, který zachytí (catch) všechny výjimky, které dosud nebyly zpracovány někde jinde. Poté se obvykle zobrazí chybové hlášení a ukončí běh aplikace, nebo v případě nekritické chyby se uživatel může informovat a běh programu pokračovat.

K velkým výhodám tohoto stylu ošetřování chyb patří mnohem lepší čitelnost funkčnosti programu. Je to dáno tím, že nedochází k mísení s kódem pro ošetřování chyb. Jinými slovy, v bloku kódu si můžeme číst aniž bychom byli jakkoliv nuceni číst kód pro ošetřování chyb.

Způsob práce s vyjímkami je v JavaScriptu velmi podobný jako v ostatní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 {...}.

/* 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
}

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity