Finally ou juste le code ?
Comparez les deux fragments de code.
-
Le premier utilise
finally
pour exécuter le code aprèstry..catch
:try { work work } catch (err) { handle errors } finally { cleanup the working space }
-
Le deuxième fragment fait le nettoyage juste après
try..catch
:try { work work } catch (err) { handle errors } cleanup the working space
Nous avons absolument besoin du nettoyage après le travail, peu importe qu’il 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 différence devient évidente quand on regarde le code dans une fonction.
Le comportement est différent s’il 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
, même via l’instruction return
: juste après la fin de try..catch
, mais avant que le code appelant obtienne le contrôle.
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!
C’est finally
qui garantit le nettoyage ici. Si nous mettons simplement le code à la fin de f
, il ne fonctionnerait pas dans ces situations.