Finally ou juste le code ?
Comparez les deux fragments de code.
-
Le premier utilise
finallypour excuter le code aprstry..catch:try { work work } catch (err) { handle errors } finally { cleanup the working space } -
Le deuxime fragment fait le nettoyage juste aprs
try..catch:try { work work } catch (err) { handle errors } cleanup the working space
Nous avons absolument besoin du nettoyage aprs le travail, peu importe quil y ait une erreur ou non.
Y at-il un avantage ici utiliser finally ou les deux fragments de code sont gaux ? Si un tel avantage existe, donnez un exemple lorsque cela compte.
La diffrence devient vidente quand on regarde le code dans une fonction.
Le comportement est diffrent sil y a un saut en dehors de try..catch.
Par exemple, quand il y a un return dans try..catch. La clause finally fonctionne en cas de toute sortie de try..catch, mme via linstruction return : juste aprs la fin de try..catch, mais avant que le code appelant obtienne le contrle.
function f() {
try {
alert('start');
return "result";
} catch (err) {
// ...
} finally {
alert('cleanup!');
}
}
f(); // cleanup!
Ou quand il y a un throw, comme ici :
function f() {
try {
alert('start');
throw new Error("an error");
} catch (err) {
// ...
if("can't handle the error") {
throw err;
}
} finally {
alert('cleanup!')
}
}
f(); // cleanup!
Cest finally qui garantit le nettoyage ici. Si nous mettons simplement le code la fin de f, il ne fonctionnerait pas dans ces situations.