Klauzule finally nebo jen kód?
Porovnejte si tyto dva fragmenty kódu.
-
První používá
finallyke spuštění kódu potry...catch:try { pracuj pracuj } catch (chyba) { ošetření chyb } finally { úklid pracovního prostoru } -
Druhý fragment umisťuje úklid hned za
try...catch:try { pracuj pracuj } catch (chyba) { ošetření chyb } úklid pracovního prostoru
Úklid po práci potřebujeme provést v každém případě, ať už nastala chyba nebo ne.
Je zde nějaká výhoda v použití finally, nebo jsou oba fragmenty kódu rovnocenné? Pokud je nějaká výhoda, vymyslete příklad, v němž se projeví.
Rozdíl uvidíme, když se podíváme na kód uvnitř funkce.
Chování se liší, pokud v něm je „vyskočení“ z try...catch.
Například když uvnitř try...catch je return. Klauzule finally se spustí při jakémkoli opuštění try...catch, dokonce i příkazem return: ihned po ukončení try...catch, ale ještě předtím, než řízení převezme volající kód.
function f() {
try {
alert('začátek');
return "výsledek";
} catch (chyba) {
/// ...
} finally {
alert('úklid!');
}
}
f(); // úklid!
…Nebo když je tam throw, například:
function f() {
try {
alert('začátek');
throw new Error("chyba");
} catch (chyba) {
// ...
if("nemůžeme ošetřit chybu") {
throw chyba;
}
} finally {
alert('úklid!')
}
}
f(); // úklid!
Úklid nám zde zajistí právě finally. Kdybychom umístili kód na konec funkce f, v těchto situacích by se nespustil.