window.unhandledrejection用于监听未被.catch()或try/catch捕获的Promise拒绝,非运行时异常;需通过addEventListener注册,event.reason可能非Error实例,应判空处理,开发期建议保留默认行为便于调试。

window.unhandledrejection 用于监听 Promise 被拒绝(rejected)但未被 .catch() 或 try/catch 捕获的情况,它不是监听 JavaScript 运行时异常(那是 window.onerror 或 window.addEventListener('error') 的职责)。
监听未处理的 Promise 拒绝
通过为 window 添加 unhandledrejection 事件监听器,可以捕获那些“漏掉”的 Promise 错误:
window.addEventListener('unhandledrejection', (event) => {
// 阻止默认行为(比如控制台报错提示)
event.preventDefault();
const reason = event.reason; // Promise.reject() 传入的值,可能是 Error 实例或任意值
const promise = event.promise; // 触发该事件的 Promise 对象
console.error('Unhandled rejection:', reason);
// 可以上报错误、记录日志、显示用户提示等
});
常见触发场景
- 异步函数中抛出错误但没加
try/catch:async function foo() { throw new Error('oops'); } - Promise 链末尾缺少
.catch():fetch('/api').then(r => r.json())(没接.catch) -
Promise.reject()后未处理:Promise.reject(new Error('no catch'))
注意点和最佳实践
-
event.reason不一定是Error实例,也可能是字符串、数字或undefined,使用前建议判断:reason instanceof Error ? reason.stack : String(reason) - 仅对“最终未处理”的 Promise 生效;一旦某个 Promise 被
.catch()或await后的try/catch捕获,就不会触发此事件 - 在开发阶段建议保留默认行为(不调
preventDefault),方便调试;生产环境可关闭控制台冗余输出并做统一上报 - 与
window.onerror配合使用,才能覆盖同步错误 + 异步 Promise 错误 + 资源加载错误等全链路异常
简单错误上报示例
结合实际用途,可快速集成基础监控:
window.addEventListener('unhandledrejection', async (event) => {
event.preventDefault();
const error = event.reason;
const url = window.location.href;
const timestamp = Date.now();
await fetch('/api/error-report', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
type: 'unhandledrejection',
message: error?.message || String(error),
stack: error?.stack,
url,
timestamp
})
});
});



















