TOC

This article has been localized into Czech by the community.

Zpracování chyb:

Zachytávání chyb (try/catch)

V úvodu této kapitoly jsme diskutovali o rozdílu mezi syntaktickými chybami a chybami za běhu. Syntaktické chyby jsou obvykle snadno odhalitelné, protože interpret (prohlížeč, pokud používáte JavaScript pro web) je okamžitě zaznamená a zabrání spuštění kódu.

Chyby za běhu jsou těžší na zpracování, protože mohou být odhaleny až po spuštění kódu a pouze v případě, že je dosaženo chybné části kódu. I přesto by měly být brány velmi vážně, protože pokud jsou dosaženy, mohou zabránit spuštění zbytku vašeho kódu a v podstatě způsobit, že vaše webová stránka/aplikace přestane fungovat podle zamýšlení.

Chyby za běhu, které nejsou ošetřeny, se často označují jako "neodchycené chyby" nebo "neodchycené výjimky", což pravděpodobně odkazuje na mechanismus, který vám umožní je zachytit: blok try..catch. Kdykoliv máte blok kódu, ve kterém děláte něco, co má potenciál selhat, měli byste zvážit jeho obalení blokem try..catch.

Pojďme vyzkoušet příklad. Následující kód volá funkci, ale bude vyhozena výjimka. V tomto případě to tak musí být, protože jsem funkci ještě nedeklaroval, ale to je jen pro potřeby příkladu - ve skutečném světě by mohlo selhání nastat také, pokud funkce jakkoliv a výjimka je vyhozena následně.

let result = AddNumbers(2, 40);
alert(result);
alert("Done!");

Výsledná chyba se objeví ve vaší konzoli a bude vypadat takto:

Uncaught ReferenceError: AddNumbers is not defined

A neuvidíte žádná z upozornění, protože tato neodchycená chyba za běhu způsobí zastavení vykonávání vašeho kódu. Opravme to použitím bloku try..catch.

try..catch bloky

Funguje to tak, že má dvě části (možná tři, ale o tom později): Část try, kde je umístěn kód, který by mohl způsobit chybu, a část catch, kam se dostaneme, pokud dojde k chybě v části try. To nám umožňuje buď něco s problémem udělat a/nebo informovat uživatele, nebo prostě nic neudělat.

Bude to vypadat takto:

try
{
	// Do potentially dangerous things here
}
catch(error)
{
	// Handle error here, if needed
}

S tím na paměti, přepišme výše uvedený příklad tak, aby používal blok try..catch:

try
{
	let result = AddNumbers(2, 40);
	alert(result);
}
catch(error)
{
	
}
alert("Done!");

Měli byste si všimnout několika věcí. Především kód stále selhává - stále se snažíme volat funkci, která nebyla deklarována, což samozřejmě selže. Nicméně v konzoli se neobjevují žádné chyby, protože teď jsme chybu zachytili, čímž jsme dali JavaScriptu vědět, že se nemusí o tuto chybu starat.

Za druhé si všimněte, že teď dostáváme upozornění "Hotovo!", které jsme předtím nedostali. Proč? Protože je mimo blok try..catch, a jelikož chybu zachytíme a zpracujeme uvnitř tohoto bloku, kód za ním má povolení běžet, což dokonale dokazuje, proč jsme zde potřebovali použít blok try..catch.

Za třetí si všimnete, že v části catch bloku skutečně nic nedělám. Někdy může být potřeba něco udělat ve snaze opravit neočekávaný výsledek části try. Můžete také chtít chybu někde zaznamenat a možná dokonce informovat uživatele o ní. Nebo můžete chtít tuto chybu zcela ignorovat, vědět, že byla zachycena. Vše závisí na konkrétní situaci.

Zacházení s chybou

V předchozím příkladu jste se možná zamýšleli nad (error) hned za klíčovým slovem catch: Co to je a proč to nepoužíváme? No, ve výchozím nastavení příkaz catch pro vás chybu zachytí a předá ji do následujícího bloku kódu, něco jako parametr. Vy si ji můžete pojmenovat - JavaScript ji předá bez ohledu na to, jak ji nazvete.

Takže v předchozím příkladu zachytáváme jakékoli chyby v části try a informace o chybě budou předány do části catch jako parametr nazvaný error. Můžete tento parametr jednoduše ignorovat, pokud nepotřebujete informace o chybě, a nakonec naprosto svobodně nemusíte dělit nic, když je chyba zachycena.

Nicméně někdy může být užitečné podívat se na informace o chybě, abyste mohli odstranit problém, nebo prostě chybu zaznamenat. Parametr bude typu Error, nebo alespoň bude od tohoto typu dědit, což znamená, že vám budou vždy poskytnuty základní informace o chybě. Zde je příklad:

try
{
	let result = AddNumbers(2, 40);
	alert(result);
}
catch(error)
{
	let msg = "Error!\n\n";
	msg += "Type: " + error.name + "\n";
	msg += "Description: " + error.message + "\n";
	alert(msg);
}
alert("Done!");

V tomto příkladu používám informace z parametru error k popisu chyby. Tyto informace mohou být snadno zaznamenány, nebo použity k poskytnutí více uživatelsky přívětivé chybové zprávy uživateli, nebo cokoli, na co si vzpomenete. Pointa je, že informace jsou dostupné a mohou být velmi užitečné.

Volitelné záchytný binding

Na druhou stranu, někdy vás skutečně nezajímá chyba, která byla vyhozena - jednoduše ji chcete ignorovat! Samozřejmě to stále můžete udělat, jak jsme viděli dříve, ale musíte stále deklarovat parametr error jako součást bloku catch. Nebo vlastně už ne. Jako součást specifikace ES2019 nyní můžete vynechat část (error) bloku catch, pokud ji nepotřebujete:

try
{
	let result = AddNumbers(2, 40);
	alert(result);
}
catch { }
alert("Done!");

Toto se nazývá volitelný binding (vazba) záchytu, a i když je v současnosti podporováno všemi moderními prohlížeči, stále existuje mnoho starších prohlížečů, které to nepodporují. Pokud zvažujete použití této funkce ve svém kódu, možná budete chtít zkontrolovat tento graf kompatibility prohlížečů, abyste zjistili, zda to má smysl pro váš konkrétní projekt.

Shrnutí

Zacházení s chybami v JavaScriptu se stává mnohem snazším při použití bloků try..catch, a nejsou specifické pouze pro JavaScript - najdete je ve trochu odlišných formách v mnoha moderních programovacích jazycích, jako jsou C#, PHP, Java a tak dále.

Kdykoli píšete kód, který by mohl potenciálně vést k chybě, musíte zvážit, zda by tento blok kódu měl být uvnitř bloku try..catch. Na druhou stranu nechcete svůj kód zbytečně komplikovat bloky try..catch všude možně. Jako u jakéhokoli programovacího úkolu jde vše o nalezení správné míry.

Z tohoto článku jste doufejme pochopili nejzákladnější aspekty používání bloku try..catch a zpracování chyb, ale zpracování chyb zahrnuje více, jak objevíme v dalším článku.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!