try...catch仅对同步错误有效,异步操作需用await+async或.catch(),全局错误和未捕获Promise拒绝须监听window.onerror和unhandledrejection事件。

直接用 try...catch 捕获同步错误没问题,但对异步操作、Promise 拒绝、全局错误或语法错误基本无效——得配合其他机制一起用。
同步代码错误必须用 try...catch 包裹
JavaScript 中只有显式被 try 块包裹的同步执行代码,抛出的错误才能被 catch 捕获。函数调用链中任何一层没包住,错误就直接冒泡到全局。
-
try块里不能只写函数声明,得是实际执行的表达式(比如parseJSON(str)而非function parseJSON(){...}) -
catch参数是错误对象,建议命名为err或error,别用e——调试时 IDE 提示不友好 - 不要空
catch:哪怕只是console.error(err),也比吞掉错误强
Promise 拒绝不能靠 try...catch 自动捕获
下面这段代码看似用了 try...catch,但 fetch 失败时根本进不了 catch 块:
try {
fetch('/api/data').then(r => r.json());
} catch (err) {
console.log('这里不会执行');
}
正确做法是:要么链式调用 .catch(),要么用 await 配合 try...catch(前提是函数声明为 async):
立即学习“Java免费学习笔记(深入)”;
- 链式:
fetch(...).then(...).catch(err => {...}) - async/await:
try { const data = await fetch(...).then(r => r.json()); } catch (err) {...} - 注意:
await只解包 Promise 的 rejection,不处理网络超时等底层异常,仍需检查response.ok或response.status
全局错误和未捕获 Promise 拒绝要单独监听
try...catch 对以下两类错误完全无感:
- 顶层语法错误(如
const a = ;),脚本加载阶段就报错,根本跑不到try - 未被
.catch()或try...await...catch处理的 Promise rejection(会触发unhandledrejection事件)
补救方式:
- 监听
window.onerror捕获同步运行时错误(含脚本加载错误) - 监听
window.addEventListener('unhandledrejection', e => {...})捕获漏网的 Promise 拒绝 - 这两处适合做错误上报,但别用来替代局部
try...catch——定位太粗,无法知道具体哪行出问题
真正难处理的不是怎么写 try...catch,而是判断该在哪一层加、加完之后要不要继续 throw、以及如何区分“可恢复错误”和“该崩就崩”的致命错误。这些没法靠语法解决,得看业务上下文。











