Promise的catch方法捕获链式调用中前序未处理的拒绝错误,包括Promise.reject、then内同步throw及返回被拒Promise;不捕获构造函数外同步错误或未包装的异步throw;位置决定作用范围,链尾最常用;返回值可继续链式调用,忽略未捕获拒绝将触发unhandledrejection警告。

Promise的catch方法专门用于捕获链式调用中前面所有then里抛出的错误(包括同步错误和异步拒绝),但它只对“未被处理的拒绝”生效——如果前面的then已经用第二个参数或catch处理过,后续catch就收不到。
catch能捕获哪些错误
catch会捕获以下三类情况:
- Promise内部reject()触发的拒绝(如
Promise.reject(new Error('fail'))) - then回调中同步抛出的异常(如
then(() => { throw new Error('boom') })) - then回调中返回一个被拒绝的Promise(如
then(() => Promise.reject('oops')))
注意:它不会捕获Promise构造函数执行器外部的同步错误,也不会捕获未return、未reject但发生了运行时错误的异步操作(比如setTimeout里的throw,除非手动包装成Promise)。
catch的位置影响捕获范围
catch是链式调用的一部分,位置决定它管到哪里:
立即学习“Java免费学习笔记(深入)”;
- 放在链尾(推荐):能兜住前面所有环节的错误,例如
fetch(...).then(...).then(...).catch(...) - 放在中间:只捕获它之前(含)的错误,之后的错误需要再接catch,例如
p.then(...).catch(...).then(...).catch(...) - 多个catch并存:每个只负责自己上游,前一个catch处理后若返回新Promise,后续错误仍需新的catch
catch之后还能继续链式调用
catch回调的返回值会成为下一个then的输入,常用来“错误降级”或“兜底恢复”:
- 返回普通值(如
return 'default'),后续then会收到这个值 - 返回一个新的Promise(如
return Promise.resolve(42)),后续then等待其完成 - 在catch里再次throw或返回reject,错误会继续向下游传播,被后续catch捕获
例如:apiCall().catch(() => localStorage.getItem('cache')).then(showData),失败时自动读缓存。
不要忽略未捕获的拒绝(Uncaught Rejection)
如果整个Promise链没有catch,且最终被拒绝,浏览器或Node.js会触发unhandledrejection事件,并可能报错警告:
- 浏览器控制台显示“Uncaught (in promise) ...”
- Node.js 15+ 默认终止进程(可监听全局事件避免)
- 建议在应用顶层加兜底处理:
window.addEventListener('unhandledrejection', e => console.warn('Unhandled:', e.reason))
实际开发中,每个异步流程终点尽量配catch,或统一用async/await + try/catch替代。










