zpět k lekci

Klauzule finally nebo jen kód?

důležitost: 5

Porovnejte si tyto dva fragmenty kódu.

  1. První používá finally ke spuštění kódu po try...catch:

    try {
      pracuj pracuj
    } catch (chyba) {
      ošetření chyb
    } finally {
      úklid pracovního prostoru
    }
  2. Druhý fragment umisťuje úklid hned za try...catch:

    try {
      pracuj pracuj
    } catch (chyba) {
      ošetření chyb
    }
    
    úklid pracovního prostoru

Úklid po práci potřebujeme provést v každém případě, ať už nastala chyba nebo ne.

Je zde nějaká výhoda v použití finally, nebo jsou oba fragmenty kódu rovnocenné? Pokud je nějaká výhoda, vymyslete příklad, v němž se projeví.

Rozdíl uvidíme, když se podíváme na kód uvnitř funkce.

Chování se liší, pokud v něm je „vyskočení“ z try...catch.

Například když uvnitř try...catch je return. Klauzule finally se spustí při jakémkoli opuštění try...catch, dokonce i příkazem return: ihned po ukončení try...catch, ale ještě předtím, než řízení převezme volající kód.

function f() {
  try {
    alert('začátek');
    return "výsledek";
  } catch (chyba) {
    /// ...
  } finally {
    alert('úklid!');
  }
}

f(); // úklid!

…Nebo když je tam throw, například:

function f() {
  try {
    alert('začátek');
    throw new Error("chyba");
  } catch (chyba) {
    // ...
    if("nemůžeme ošetřit chybu") {
      throw chyba;
    }

  } finally {
    alert('úklid!')
  }
}

f(); // úklid!

Úklid nám zde zajistí právě finally. Kdybychom umístili kód na konec funkce f, v těchto situacích by se nespustil.