torna alle lezioni

Finally o solamente il codice?

importanza: 5

Confronta i due frammenti di codice.

  1. Il primo utilizza finally per eseguire il codice dopo try...catch:

    try {
      lavoro lavoro
    } catch (e) {
      gestione errori
    } finally {
      ripulisci lo spazio di lavoro
    }
  2. Il secondo posiziona la pulizia subito dopo il try...catch:

    try {
      lavoro lavoro
    } catch (e) {
      gestione errori
    }
    
    ripulisci lo spazio di lavoro

Abbiamo decisamente bisogno di ripulire dopo il lavoro, sia che si verifichi un errore o meno.

Esiste un vantaggio nell’usare finally o ambedue i frammenti di codice sono equivalenti? Se c’è qualche vantaggio, allora fornisci un esempio di quanto sia importante.

La differenza diventa ovvia quando inseriamo il codice all’interno di una funzione.

Il comportamento è diverso se c’è una “uscita anticipata” dal try...catch.

Per esempio, quando c’è un return all’interno del try...catch. La clausola finally funziona qualunque sia la lcausa dell’uscita dal try...catch, anche tramite l’istruzione “return”: appena il try...catch è terminato, ma prima che il codice richiamato prenda il controllo.

function f() {
  try {
    alert('start');
    return "result";
  } catch (err) {
    /// ...
  } finally {
    alert('cleanup!');
  }
}

f(); // cleanup!

…O quando si presenta un throw, come:

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!

È finally che garantisce la pulizia qui. Se inseriamo del codice alla fine di f, in queste situazioni, non verrà eseguito.