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 detry..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.