javascript 的 try...catch 仅捕获同步异常,无法直接捕获 promise、settimeout 等异步错误;需用 .catch()、await+try...catch 或全局事件监听器(onerror/onunhandledrejection)协同处理。

JavaScript 中 try...catch 是捕获同步代码异常的核心机制,但它**无法直接捕获异步操作(如 Promise、setTimeout、fetch)中抛出的未处理错误**,需配合其他方式协同处理。
基本结构与同步异常捕获
try...catch 适用于包裹可能立即抛出错误的同步逻辑。一旦 try 块内执行时发生异常(比如访问 undefined 属性、调用非函数值、类型错误等),JS 引擎会立即中断当前执行,跳转到 catch 块。
示例:
try {
const data = JSON.parse('{"name": "Alice",'); // 缺少 },语法错误
console.log(data);
} catch (err) {
console.error('解析失败:', err.message); // 捕获 SyntaxError
}
- catch 参数(常写作
err或error)是 Error 实例,包含message、name、stack等属性 - 可选使用
finally块执行清理工作(无论是否出错都会执行) - 不推荐空 catch(即
catch {}),会静默吞掉错误,不利于调试
Promises 中的异常处理
Promise 内部抛出的错误不会被外层 try...catch 捕获,因为它是异步微任务。正确方式是使用 .catch() 或 await + try...catch。
- 链式调用中,在末尾加
.catch()可捕获前面任意then中的异常或 Promise rejection - 使用
async/await时,await 后的 Promise 被 reject,会以 throw 形式抛出,可被外层try...catch捕获
async function fetchUser() {
try {
const res = await fetch('/api/user');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('请求或解析失败:', err.message);
throw err; // 可选择重新抛出供上层处理
}
}
全局异常兜底(仅作补充)
对于未被捕获的同步错误,可监听 window.onerror;对于未处理的 Promise rejection,监听 window.onunhandledrejection。它们不能替代局部 try...catch,而是最后防线,用于日志上报或用户提示。
window.addEventListener('error', event => {
console.warn('全局 JS 错误:', event.error);
});
window.addEventListener('unhandledrejection', event => {
console.warn('未处理的 Promise 拒绝:', event.reason);
});
- 这些事件监听器无法阻止错误传播,也不能恢复程序状态
- 在生产环境建议结合 Sentry、Bugsnag 等工具做结构化错误采集
常见误区与建议
- 不要用
try...catch处理本可预防的错误(如先检查obj && obj.prop,而非依赖捕获 TypeError) - 避免在循环中无差别包裹大量语句——应聚焦于真正可能失败的操作(如 JSON 解析、DOM 查找、第三方 API 调用)
- catch 中尽量具体判断错误类型(如
err instanceof SyntaxError),再决定是重试、降级还是上报 - Node.js 环境中,还需关注
process.on('uncaughtException')和process.on('unhandledRejection')
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











