retour au cours

Finally ou juste le code?

importance: 5

Comparez les deux fragments de code.

  1. Le premier utilise finally pour exécuter le code après try..catch :

    try {
      work work
    } catch (err) {
      handle errors
    } finally {
      cleanup the working space
    }
  2. 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.