在JavaScript的异步编程场景中,Promise已经成为主流的异步处理方案,而错误捕获是保证程序健壮性的关键环节。如果Promise内部的异步操作或者回调函数执行时出现错误,没有正确捕获的话,可能会导致错误被静默忽略,甚至引发整个应用的异常。

一、使用Promise自带的catch方法捕获错误
每个Promise实例都有一个catch方法,它是then(null, rejection)的语法糖,专门用来捕获Promise被拒绝(rejected)时的错误。当Promise内部抛出错误,或者主动调用reject方法时,错误会沿着Promise链向下传递,直到遇到第一个catch或者then的第二个错误处理回调。
下面是一个基础的使用示例:
// 创建一个会被拒绝的Promise
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
// 模拟异步操作出错
reject(new Error('异步操作执行失败'));
}, 1000);
});
// 使用catch捕获错误
promise.catch((error) => {
console.log('捕获到Promise错误:', error.message);
});如果是Promise链式调用,错误会一直向后传递,直到被捕获:
new Promise((resolve) => {
resolve(1);
})
.then((value) => {
// 这里抛出错误,会被后续的catch捕获
throw new Error('then回调中出错');
return value + 1;
})
.then((value) => {
console.log('不会执行到这里');
})
.catch((error) => {
console.log('捕获到链式调用中的错误:', error.message);
});二、async/await配合try/catch捕获错误
当使用async/await语法处理Promise时,因为await会把Promise的异步结果转成同步写法,所以可以用传统的try/catch语句来捕获错误。这种方式写出来的代码逻辑更清晰,和同步代码的错误处理风格统一,也是目前很多项目中的主流写法。
示例代码如下:
// 定义一个返回Promise的异步函数
function asyncTask() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const random = Math.random();
if (random > 0.5) {
resolve('任务执行成功');
} else {
reject(new Error('任务执行失败'));
}
}, 1000);
});
}
// 使用async/await配合try/catch捕获错误
async function runTask() {
try {
const result = await asyncTask();
console.log('任务结果:', result);
} catch (error) {
console.log('捕获到async/await的错误:', error.message);
}
}
runTask();需要注意的是,await后面如果不是Promise,会被自动包装成resolved状态的Promise,这时候如果后续有错误,也需要在try块中才会被捕获。
三、捕获未处理的Promise错误
如果Promise被拒绝之后,没有任何catch或者错误处理回调捕获,就会成为未处理的Promise错误,在浏览器环境中会触发unhandledrejection事件,我们可以通过监听这个事件来捕获全局的未处理Promise错误,做统一的兜底处理。
示例代码如下:
// 监听未处理的Promise拒绝事件
window.addEventListener('unhandledrejection', (event) => {
console.log('捕获到未处理的Promise错误:', event.reason);
// 可以阻止默认的错误提示
event.preventDefault();
});
// 这个错误没有被捕获,会触发上面的事件
new Promise((resolve, reject) => {
reject(new Error('未捕获的全局错误'));
});四、常见错误捕获误区
- 不要在Promise内部使用try/catch捕获异步错误:Promise内部的异步操作(比如setTimeout、网络请求)抛出的错误,在Promise构造函数外部用try/catch是捕获不到的,因为异步操作的执行时机已经脱离了当前的执行栈。
- catch之后可以继续链式调用:
catch方法本身也会返回一个新的Promise,如果catch内部没有抛出新的错误,后续的then还会正常执行。 - 不要在async函数中忘记await:如果调用async函数但是不await,函数内部抛出的错误不会被外部的try/catch捕获,需要单独处理或者await之后才能捕获。
掌握以上几种Promise错误捕获的方式,就可以覆盖绝大多数JavaScript异步场景的错误处理需求,有效提升代码的稳定性和可维护性。
Promise错误捕获catch方法async_awaittry_catch修改时间:2026-06-07 03:09:53