try...catch仅捕获同步运行时错误,如throw、undefined属性访问、非法函数调用、JSON.parse异常;无法捕获异步错误、语法错误、未处理Promise拒绝等。

JavaScript 的 try...catch 不是万能兜底方案,它只捕获同步执行中的运行时错误,对异步错误、语法错误、Promise 拒绝(未加 .catch())或 console.error 都无能为力。
哪些错误能被 try...catch 捕获
仅限当前执行栈中抛出的同步异常,比如:
throw new Error('oops')- 访问
undefined的属性:let a; a.b.c - 调用非函数值:
let fn = null; fn() JSON.parse('invalid json')
注意:setTimeout(() => { throw new Error('async') }) 这类异步抛出的错误,try...catch 完全抓不到。
catch 块里该做什么
不要只写 console.log(err) 就完事。实际开发中建议:
立即学习“Java免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
- 检查
err.name和err.message,而非只依赖err.toString() - 对已知可恢复错误(如网络超时、格式错误)做针对性处理,比如重试或提示用户修正输入
- 避免在
catch中再抛出未处理的新错误,除非你明确要向上冒泡 - 必要时记录上下文:当前函数名、关键变量值(脱敏后)、时间戳
示例:
try {
const data = JSON.parse(input);
process(data);
} catch (err) {
if (err.name === 'SyntaxError') {
showUserMessage('输入格式不正确,请检查 JSON 格式');
} else {
reportErrorToMonitor(err, { context: 'parseInput' });
}
}
finally 不是“一定会执行”的保险箱
finally 块在 try 或 catch 执行完毕后运行,但有三个常见例外:
- 页面被强制关闭(用户关掉标签页 / 浏览器崩溃)
- 脚本被外部中断(如开发者工具中点击“暂停脚本”并终止)
-
process.exit()(Node.js 环境)或self.close()(Worker 中)
所以别把关键清理逻辑(如释放锁、关闭连接)只放在 finally 里——尤其在 Web Worker 或 Node.js 长任务中,得配合超时或心跳机制兜底。
真正难处理的是跨异步边界和跨上下文的错误,比如 fetch 失败、addEventListener 回调里的异常、第三方 SDK 内部抛错——这些得靠 window.onerror、window.onunhandledrejection、process.on('uncaughtException') 等机制补位,而不是指望一个 try...catch 块。










