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 返回阻止 try
或 catch
中的 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);
这个问题可能与其他已回答的问题相似,但我找不到与 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 返回阻止 try
或 catch
中的 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);