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