TOC

This article has been localized into Czech by the community.

Zpracování chyb:

Zachytávání a vyhazování chyb (try/catch/finally)

V předchozím článku jsme představili zpracování chyb pomocí bloků try..catch. V tomto článku se ponoříme trochu hlouběji a probereme další dostupné nástroje pro zpracování chyb/výjimek.

try..catch..finally

Především mi dovolte představit třetí část konstrukce try/catch: část finally. Jak jsme diskutovali v předchozím článku, máme část try, která obsahuje kód, který by mohl vyvolat chybu. Poté máme část catch, která bude provedena pokud, a pouze pokud, část try vyústí v chybu. Ale máme zde ještě jednu, volitelnou, část nazvanou finally.

Část finally je pro kód, který chcete mít proveden po dvou ostatních částech, bez ohledu na to, zda dojde k chybě/výjimce, nebo ne. Obecně řečeno, část finally se často používá pro úklid po něčem, co jsme (se snažili) dělat v části try. Takže například pokud otevřete spojení s databází nebo otevřete soubor pro zápis a něco půjde špatně, můžete použít část finally k zajištění, že spojení/soubor bude zavřen před pokračováním v ostatním kódu.

Zde je příklad, jak lze použít blok try..catch..finally:

try
{
	openDBConnection();
	doStuffThatMightThrowAnError();
}
catch(error)
{
	handleError(error);
}
finally
{
	closeDBConnection();
}

V tomto příkladu, pokud se v části try něco pokazí nebo pokud vše funguje podle očekávání, spojení s databází se uzavře. Abychom viděli skutečnou sílu části finally, zvažme tento příklad:

function DoStuff()
{
	try
	{
		return 1;
	}
	catch(error)
	{
		return 2;
	}
	finally
	{
		return 3;
	}
}

alert(DoStuff());

Protože kód v části try nevyvolává chybu, mohli byste očekávat, že výsledek této funkce je 1, ale není. I když se snažíme vrátit 1, povaha konstrukce try..catch..finally zajišťuje, že část finally je provedena jako poslední, což přepisuje výsledek funkce a místo toho vrací 3.

Vyhazování chyb

Zpracování chyb není jen o jejich zachytávání. Pokud píšete kód, který má být volán jinými programátory, jste také zodpovědní za zpracování chyb ve vašem kódu a musíte se ujistit, že jsou komunikovány spotřebiteli vašeho kódu správným způsobem.

Jako příklad si vezměme tuto funkci:

function AddNumbers(n1, n2)
{
	if((Number.isInteger(n1)) && (Number.isInteger(n2)))
		return n1 + n2;
	return 0;
}

alert(AddNumbers("2", "40"));

V tomto vymyšleném scénáři, když jsme psali funkci AddNumbers(), byla navržena pouze pro práci s celými čísly, takže jsme do ní přidali trochu validace. Pokud je předána jakákoli hodnota, která není celé číslo, např. desetinné číslo nebo řetězec, jak je uvedeno ve výše uvedeném příkladu, funkce jednoduše vrátí 0.

Pokud jste jak tvůrcem, tak spotřebitelem funkce, jako v příkladu výše, není to problém. Ale co když je tato konkrétní funkce ukryta v jednom z několika stovek souborů, jako součást obrovské knihovny nebo aplikace, a co když funkce není jednoduchá, ale místo toho obsahuje 150 řádků složité logiky?

Když tuto funkci volají jiní programátoři, nevědí, že funkce vyžaduje celočíselné parametry, a když předají jiné hodnoty, možná nepochopí, proč od ní dostanou zpět pouze 0. Jako alternativu bychom měli zvážit vyhození vhodné chyby, abychom spotřebitele funkce upozornili, že ji použili špatně:

function AddNumbers(n1, n2)
{
	if((Number.isInteger(n1)) && (Number.isInteger(n2)))
		return n1 + n2;
	else
		throw new Error("Please use only integers for parameters n1 and n2!");	
}

alert(AddNumbers("0", "42"));

Nyní, pokud jsou do naší funkce předány ne-celočíselné hodnoty, vyhodíme chybu s vhodnou chybovou zprávou, která vysvětlí spotřebiteli funkce, co se pokazilo. Pokud se pokusíte příklad spustit, neuvidíte upozornění - místo toho uvidíte naši vlastní chybu v konzoli vašeho prohlížeče.

Nyní jsme přesunuli zodpovědnost za zpracování chyb na spotřebitele funkce - on/ona bude muset chybu zachytit a rozhodnout, co s ní bude dále. Například může být chyba nahlášena uživateli, buď s podrobnostmi nebo s nějakou obecnou zprávou typu "Jejda, něco se pokazilo!", pokud nechceme sdílet žádné podrobnosti s uživatelem:

function AddNumbers(n1, n2)
{
	if((Number.isInteger(n1)) && (Number.isInteger(n2)))
		return n1 + n2;
	else
		throw new Error("Please use only integers for parameters n1 and n2!");	
}

try
{
	alert(AddNumbers("0", "42"));
}
catch(e)
{
	// Log the error
	alert("Sorry, the numbers could not be added - please try again!");	
}

Shrnutí

(Volitelná) část finally bloku try..catch umožňuje zajistit spuštění kódu při ukončení konstrukce try..catch. Tento kód bude proveden bez ohledu na to, zda došlo k chybě nebo ne, a často se používá k uvolnění důležitých zdrojů, jako jsou soubory nebo vzdálená připojení.

Použitím klíčového slova throw se můžeme zapojit do ekosystému zpracování chyb a sami vyhazovat chyby, abychom poskytli přesnější indikaci toho, co se pokazilo. Dokonce můžeme vytvářet naše vlastní vlastní chyby, jak probereme v jednom z dalších článků.


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!