Back to the lesson

Finally or just the code?

importance: 5

Compare the two code fragments.

  1. The first one uses finally to execute the code after try..catch:

    try {
      work work
    } catch (e) {
      handle errors
    } finally {
      cleanup the working space
    }
  2. The second fragment puts the cleaning right after try..catch:

    try {
      work work
    } catch (e) {
      handle errors
    }
    
    cleanup the working space

We definitely need the cleanup after the work has started, doesn’t matter if there was an error or not.

Is there an advantage here in using finally or both code fragments are equal? If there is such an advantage, then give an example when it matters.

The difference becomes obvious when we look at the code inside a function.

The behavior is different if there’s a “jump out” of try..catch.

For instance, when there’s a return inside try..catch. The finally clause works in case of any exit from try..catch, even via the return statement: right after try..catch is done, but before the calling code gets the control.

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

f(); // cleanup!

…Or when there’s a throw, like here:

function f() {
  try {
    alert('start');
    throw new Error("an error");
  } catch (e) {
    // ...
    if("can't handle the error") {
      throw e;
    }

  } finally {
    alert('cleanup!')
  }
}

f(); // cleanup!

It’s finally that guarantees the cleanup here. If we just put the code at the end of f, it wouldn’t run.