Finally or just the code?
Sammenlign disse to kodefragmenter.
-
Den første bruger
finallytil at køre koden eftertry...catch:try { arbejd' arbejd' } catch (err) { håndter fejl } finally { ryd op på arbejdspladsen } -
Den anden placerer oprydningen lige efter
try...catch:try { arbejd' arbejd' } catch (err) { håndter fejl } ryd op på arbejdspladsen
Vi skal selvfølgelig have oprydningen efter arbejdet, uanset om der var en fejl eller ej.
Er der en fordel i at bruge finally eller er de to kodefragmenter ens? Hvis der er en sådan fordel, så giv et eksempel på, når det betyder noget.
Forskellen bliver tydelig, når vi kigger på koden inde i en funktion.
Det er forskelligt, hvis der er et “spring ud” af try...catch.
For eksempel, når der er en return inde i try...catch. finally-klausulen virker i tilfældet af hvilken som helst afslutning fra try...catch, selv via return-sætningen: lige efter try...catch er færdig, men før den kaldende kode får kontrollen.
function f() {
try {
alert('start');
return "resultat";
} catch (err) {
/// ...
} finally {
alert('oprydning!');
}
}
f(); // oprydning!
…eller hvis der er en throw, som her:
function f() {
try {
alert('start');
throw new Error("en fejl");
} catch (err) {
// ...
if("kan ikke håndtere fejlen") {
throw err;
}
} finally {
alert('oprydning!')
}
}
f(); // oprydning!
Det er finally der garanterer oprydningen her. Hvis vi bare sætter koden ved slutningen af f, ville den ikke køre i disse situationer.