try-catch仅捕获同步错误,异步错误需用async/await配合或.catch()处理;Promise构造函数内同步错误转reject但不触发外层catch;unhandledrejection仅用于日志上报,不可替代主动错误处理。

try-catch 只能捕获同步错误,异步代码里直接写会失效
很多人把 fetch 或 setTimeout 套进 try 块里,结果错误照样冒泡到全局。这是因为 try-catch 作用域只覆盖当前执行栈,而异步回调在后续事件循环中运行,已脱离原 try 上下文。
- 同步错误(如
JSON.parse('invalid')、undefined.foo)能被正确捕获 -
Promise构造函数内部抛出的同步错误(如new Promise(() => { throw new Error('boom') }))会被自动转为 reject,但不会触发外层catch - 想让
try-catch管到异步逻辑,得配合async/await—— 它让 Promise 链“看起来像同步”,从而让catch生效
async/await + try-catch 是处理 Promise 错误最直观的方式
只要函数声明为 async,内部 await 的 Promise 被 reject,就会像抛异常一样被 catch 捕获。不需要手动写 .catch(),代码更线性,错误堆栈也更清晰。
async function loadData() {
try {
const res = await fetch('/api/data');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error('加载失败:', err.message);
// 这里能拿到 fetch 失败、JSON 解析失败、甚至 res.ok 判断抛出的错误
}
}
- 注意:
await后面必须是 Promise,否则不会等待,也不会触发catch - 多个
await可共用一个try-catch,但要小心前序失败导致后续不执行 - 如果某个请求失败后还想继续发下一个请求,就别用
await连写,改用Promise.allSettled或单独.catch()
Promise.catch() 适合链式调用和并行错误隔离
当不使用 async/await,或需要对单个 Promise 做独立错误处理时,.catch() 更灵活。它只捕获前一个 Promise 的 reject,不影响后续链上其他 Promise 的状态。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
fetch('/api/users')
.then(res => {
if (!res.ok) throw new Error('Users API failed');
return res.json();
})
.then(users => {
return fetch(`/api/profile/${users[0].id}`);
})
.then(res => res.json())
.catch(err => {
console.error('任一环节出错:', err.message);
});
-
.catch()是链式终点,一旦触发,后续.then()不再执行(除非你在catch里返回新值或 Promise) - 如果想“吞掉”某个错误并继续链式流程,就在
catch里返回一个默认值或Promise.resolve(...) - 避免只写
.catch(() => {})却不处理或 re-throw,这会让错误静默消失,调试困难
未捕获的 Promise 拒绝会触发 unhandledrejection,但不能靠它兜底
浏览器和 Node.js 都提供 window.addEventListener('unhandledrejection'),但它只是最后警报,不是错误处理机制。等走到这一步,说明你漏掉了所有 catch 或 try-catch。
立即学习“Java免费学习笔记(深入)”;
- 它无法阻止错误发生,也不能恢复执行流
- 适合做日志上报,比如发送错误信息到监控服务:
event.reason就是被 reject 的值 - 不要在
unhandledrejection里尝试“修复”逻辑 —— 此时上下文早已丢失,补救无效 - 真正可靠的策略是:每个 Promise 都有明确的
.catch(),或每个await都在try内
async 函数里调用了没 await 的 Promise,或者 Promise.all([p1, p2]) 中某个失败却没处理 rejection。这类问题不会立即报错,但会在特定数据路径下突然崩溃。










