为什么我的JavaScript Error监控没有捕获到Promise中的错误?

Air-光星 阅读 88

我给window绑定了onerror和onunhandledrejection,但发现Promise里的reject错误没有被监控到。比如这个代码:

window.onerror = (msg, url, line) => {
  console.log('捕获到错误:', msg); // 这里没输出
};

Promise.reject('测试错误').catch(() => {}); // 我故意没处理这个catch

我原本以为未处理的Promise.reject会被onunhandledrejection抓到,但即使移除.catch()还是没触发。是不是这两个监听器的使用顺序有问题?或者Promise错误需要单独配置?

我来解答 赞 15 收藏
二维码
手机扫码查看
2 条解答
皇甫欢欢
你遇到的问题很常见,其实主要原因是 onunhandledrejection 的触发机制。这个事件在Promise被reject且没有在当前事件循环中处理时才会触发。

首先你得确认你的 onunhandledrejection 处理器已经正确设置:

window.onunhandledrejection = function(event) {
console.log('未处理的Promise拒绝:', event.reason);
};


其次要注意的是,如果你在Promise链上立即使用了.catch()(即使里面是空的),浏览器会认为这个错误已经被"处理"了,所以不会触发 onunhandledrejection

如果想真正测试未处理情况,去掉.catch()或者让catch块抛出新错误:

Promise.reject('测试错误').catch((err) => {
throw new Error('继续抛出: ' + err);
});


后端处理逻辑也类似,记得观察Promise链的完整执行流程。这种异步错误捕捉确实容易让人困惑,多调试几次就清楚了。有时候我也得对着代码发呆好久才能搞明白这些问题。
点赞
2026-03-27 12:24
Top丶纳利
window.onunhandledrejection 只捕获未处理的 Promise 错误,但你的 .catch() 已经算处理过了。如果想测试,去掉 .catch() 就行。

正确示例:
window.onunhandledrejection = (event) => {
console.log('捕获到未处理的 Promise 错误:', event.reason);
};

Promise.reject('测试错误'); // 别加 catch


就这样。
点赞 2
2026-01-30 09:31