javascript 中 try...catch 可让代码在捕获异常后继续执行后续语句,关键在于 catch 内不抛新错、安全处理错误并用状态变量控制流程分支,finally 仅用于清理而非错误恢复。

在 JavaScript 中,try...catch 本身就能让代码在捕获异常后继续执行 catch 块之后的语句——关键在于**别让异常穿透出 try 块**,也不要在 catch 中主动 throw 或调用会再次抛错的逻辑。
确保异常被真正“消化”掉
只要 catch 块执行完毕且没有新的异常抛出,控制流就会自然落到 try...catch 结构之后的代码上。
✅ 正确示例:
console.log('开始');
try {
JSON.parse('invalid json'); // 抛出 SyntaxError
} catch (err) {
console.error('解析失败,但已处理:', err.message);
// 这里没 throw,也没调用可能出错的代码
}
console.log('继续执行'); // ✅ 这行会被执行
避免在 catch 中引发新异常
如果 catch 里做了不安全操作(比如访问 undefined 属性、调用未定义函数),会触发新错误,导致后续流程中断。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ❌ 错误写法:
catch(e) { console.log(e.message.toUpperCase()); }(e 可能是 null/undefined) - ✅ 安全写法:
catch(e) { console.log(e?.message?.toUpperCase() || '未知错误'); }
需要“跳过某步但不中断整体流程”时,用变量标记状态
有时你希望异常发生后跳过后续依赖该步骤的逻辑(比如请求失败就不更新 UI),这时可用标志位控制流程分支:
let dataLoaded = false;
try {
const res = await fetch('/api/data');
dataLoaded = true;
renderData(await res.json());
} catch (err) {
console.warn('加载数据失败,使用默认值');
// 不 throw,dataLoaded 保持 false
}
// 后续逻辑根据状态决定是否执行
if (dataLoaded) {
enableExportButton();
} else {
disableExportButton();
}
showStatusMessage(); // ✅ 总是执行
慎用 finally —— 它总是执行,但不解决“继续执行”的核心问题
finally 适合放清理代码(如关闭 loading、释放资源),但它不能替代 catch 的错误处理职责。若 catch 没兜住错误,finally 执行完仍会冒泡;若 catch 已处理完毕,finally 就是锦上添花。
⚠️ 注意:finally 中 return 会覆盖 try 或 catch 中的返回值,容易引发意外行为,一般不建议在里面 return。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










