在 javascript 中,如果 try 块中包含 return 语句,finally 块中的代码一定会执行。若 finally 块中也包含 return 语句,则 finally 的返回值会覆盖 try 的返回值;若 finally 没有 return 但抛出了异常,则该异常会取代 try 的返回值或异常向外抛出。

try 中有 return 时 finally 是否执行
是的,finally 块中的代码无论如何都会执行。即使 try 块中已经执行了 return,JavaScript 引擎也会先保存当前的返回值(或异常),然后跳转到 finally 块执行其中的逻辑,最后再决定最终返回什么值或抛出什么异常。

function testFinally() {
try {
console.log('try block');
return 'from try';
} finally {
console.log('finally block');
}
}
console.log(testFinally());
运行上述代码,控制台输出顺序为:
1. try block
2. finally block
3. from try
这表明 finally 在 return 之后、函数实际返回之前执行,且未改变返回值。
finally 中有 return 时如何覆盖 try 的返回值
当 finally 块中也包含 return 语句时,finally 的返回值将完全覆盖 try 块中设置的返回值。无论 try 中返回的是什么值,甚至 try 中发生了异常,只要 finally 有 return,函数的最终结果就是 finally 的返回值。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

function testOverride() {
try {
return 'from try';
} finally {
return 'from finally';
}
}
console.log(testOverride());
运行上述代码,输出结果为 from finally。try 中的 'from try' 被忽略。这种机制常用于资源清理后强制返回特定状态,但通常不建议在 finally 中使用 return,因为它会静默丢弃 try 中的错误或正常返回值,导致调试困难。
finally 中抛出异常对 try 返回值的影响
如果 finally 块中没有 return,但执行过程中抛出了异常,那么该异常会直接向外抛出,try 块中的返回值将被丢弃。这意味着,即使 try 中成功计算并准备返回一个值,只要 finally 出错,调用者接收到的就是一个未捕获的异常,而不是原定的返回值。
function testException() {
try {
return 'from try';
} finally {
throw new Error('error in finally');
}
}
try {
console.log(testException());
} catch (e) {
console.log(e.message);
}
运行上述代码,输出结果为 error in finally。try 中的 'from try' 未被返回,因为 finally 中的异常中断了正常的返回流程。这进一步强调了在 finally 中应避免抛出异常或进行可能失败的操作,以确保程序状态的确定性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










