返回课程

最后还是只有代码?

重要性:5

比较这两个代码片段。

  1. 第一个使用 finallytry...catch 后执行代码

    try {
      work work
    } catch (err) {
      handle errors
    } finally {
      cleanup the working space
    }
  2. 第二个片段将清理代码放在 try...catch 之后

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

我们肯定需要在工作完成后进行清理,无论是否发生错误。

在这里使用finally有什么优势,还是两个代码片段是等效的?如果有优势,请举例说明它何时重要。

当我们查看函数内部的代码时,差异变得显而易见。

如果存在从try...catch“跳出”,则行为不同。

例如,当try...catch内部存在return时。finally子句在任何try...catch退出时都有效,即使通过return语句:在try...catch完成之后,但在调用代码获得控制之前。

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

f(); // cleanup!

…或者当存在throw时,例如这里

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保证了这里的清理。如果我们只是将代码放在f的末尾,它在这些情况下将不会运行。