Skip to content

Latest commit

 

History

History
47 lines (38 loc) · 987 Bytes

File metadata and controls

47 lines (38 loc) · 987 Bytes

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 (err) {
    /// ...
  } finally {
    alert('cleanup!');
  }
}

f(); // cleanup!

...Or when there's a throw, like here:

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!

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