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.