JavaScript finally 块中的代码与 try ... catch 之后的代码之间的区别

Difference between code in JavaScript finally block and after try ... catch

这个问题可能与其他已回答的问题相似,但我找不到与 JavaScript 有关的答案。

finally 块中的代码与 整个 try ... catch ... finally 语句之后的代码有什么区别?

也就是这段代码有什么区别:

try {
  f(x);
}
catch(e) {
  g(e);
}
finally {
  h(y);
}

和这段代码:

try {
  f(x);
}
catch(e) {
  g(e);
}
h(y);

一个区别是,如果一个值在 finally 中被 returned,它将覆盖先前 try 和 [=] 中的值 returned 14=]块:

function foo() {
  try {
    throw new Error('1');
  } catch(e) {
    return '2';
  } finally {
    return '3';
  }
}
console.log(foo());

从最终 will also 返回阻止 trycatch 中的 throw 向外渗透 - 相反,只有 finally 的正常return 完成值将是结果。

(function() {
  try {
    try {
      throw new Error('oops');
    } catch (ex) {
      console.error('inner', ex.message);
      throw ex;
    } finally {
      console.log('finally');
      return;
    }
  } catch (ex) {
    // not entered into
    console.error('outer', ex.message);
  }
})();

我承认这个问题一开始让我摸不着头脑。但是看看 MDN reference for try...catch includes this salient section on "Returning from a finally-block”。看起来如果你从 finally 块中 return,它将覆盖从前面的 try 或 [=16] 返回或抛出的任何东西=] 块。因此,虽然您的示例可能相同,但如果您将其更改为:

try {
  return f(x);
}
catch(e) {
  throw g(e);
}
finally {
  return h(y);
}

...与此根本不同:


try {
  return f(x);
}
catch(e) {
  throw g(e);
}
return h(y);