news 2026/4/6 19:29:41

Promise 未捕获 reject 错误处理指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Promise 未捕获 reject 错误处理指南

当 Promise 被 reject 且未处理时,浏览器会显示 "Uncaught (in promise)" 错误。


本文介绍了三种常见未处理情况:

  • 直接 reject
  • async 函数抛出错误
  • then 链中未捕获的错误

提供了四种处理方法:

  • 使用 .catch()
  • try...catch
  • Promise 构造函数内部捕获
  • 全局事件监听(unhandledrejection)

最佳实践建议始终为 Promise 添加错误处理,包括使用空 catch 处理不关心的结果,以及使用 Promise.allSettled 处理并行操作。


这些方法能有效防止应用因未处理的 Promise 错误而崩溃,同时改善调试体验。


关联阅读推荐

JavaScript Promise 总结(附:常见返回 Promise 的API,ServiceWorker 中 Promise)


Promise 未捕获 reject 错误处理指南


当 Promise 被 reject 且没有相应的错误处理时,浏览器控制台确实会显示警告/错误。


具体表现

在 Chrome DevTools 中,你会看到类似这样的错误:

Uncaught (in promise) Error: Something went wrong at <anonymous>:1:20

为什么会出现这个警告?


Promise 的设计哲学是:每个 reject 都应该被处理。


如果 reject 没有被捕获,JavaScript 引擎认为这可能是一个未被注意的错误。


示例代码

// 情况1:直接 reject 没有被处理 const promise1 = new Promise((resolve, reject) => { reject(new Error('Something went wrong')); }); // 控制台会显示:Uncaught (in promise) Error: Something went wrong // 情况2:async 函数中 throw 没有被捕获 async function failedAsync() { throw new Error('Async error'); } failedAsync(); // 同样会显示未捕获的 promise 错误 // 情况3:then 链中的 reject 没有被后续的 catch 处理 Promise.resolve() .then(() => { throw new Error('Error in then'); }); // 这里虽然看起来有 then,但没有 catch,所以错误仍未被捕获

如何正确处理?

1.使用.catch()

promise .then(result => { // 处理成功情况 }) .catch(error => { // 处理 reject 和 then 中抛出的错误 console.error('Caught error:', error); });

2.使用try...catch处理 async/await

async function handleAsync() { try { await someAsyncFunction(); } catch (error) { console.error('Caught error:', error); } }

3.在 Promise 构造函数中捕获错误

const safePromise = new Promise((resolve, reject) => { try { // 可能出错的代码 const result = riskyOperation(); resolve(result); } catch (error) { reject(error); } });

4.全局捕获未处理的 Promise 错误

// 在浏览器中 window.addEventListener('unhandledrejection', event => { console.warn('未处理的 Promise 拒绝:', event.reason); event.preventDefault(); // 阻止默认的控制台错误 }); // 在 Node.js 中 process.on('unhandledRejection', (reason, promise) => { console.log('未处理的拒绝:', reason); });

最佳实践建议

  1. 总是为 Promise 链添加错误处理

  2. 在 async 函数中总是使用 try...catch

  3. 对于不关心结果的 Promise,至少加上一个空的 catch

    someAsyncOperation().catch(() => {});
  4. 对于可能失败的多个并行操作,使用Promise.allSettled

    const results = await Promise.allSettled(promises); results.forEach(result => { if (result.status === 'rejected') { console.log('失败:', result.reason); } });

这样可以确保你的应用不会因为未处理的 Promise 错误而崩溃,同时也能获得更好的调试体验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 19:16:36

前端判断不等于 undefined 不等于 null 的方法

前端判断不等于 undefined 不等于 null 的方法 在前端开发&#xff08;JavaScript/TypeScript&#xff09;中&#xff0c;判断一个变量既不等于 undefined 也不等于 null&#xff0c;通常被称为判断“空值”或“有效存在”。 以下是几种常用且推荐的方法&#xff0c;你可以根…

作者头像 李华
网站建设 2026/3/31 10:23:50

MCP4725 I2C 12位数模DA转换模块原理图设计,已量产

目录 1、核心芯片:MCP4725 为什么是首选? 2、原理图深度拆解:每一处设计都有讲究 2.1、电源系统:LP5907 带来的稳定供电 2.2、DAC 核心电路:MCP4725 的极简设计 2.3、I2C 接口与地址配置:灵活适配多设备级联 2.4、低功耗设计:<0.2mA 的 “隐形优势” 在 Arduin…

作者头像 李华
网站建设 2026/4/1 3:02:04

Palantir 第四季度财报深度解读CEO致股东信:43亿美元订单,70%营收增长,AI驱动下的惊人增长与企业级AI技术帝国的宏伟愿景

摘要 Palantir CEO亚历克斯卡普在2026年2月2日发布的致股东信中,宣布公司第四季度营收达到创纪录的14亿美元,同比增长70%,美国市场营收达11亿美元,同比增长93%。公司单季利润达6.09亿美元,环比增长28%。信中强调了AI技术的实际应用价值,批判了行业内的浮夸风气,阐述了技术如何…

作者头像 李华
网站建设 2026/4/3 3:21:36

细胞电生理仿真软件:GENESIS_(10).实验设计与仿真

实验设计与仿真 在细胞电生理仿真软件中&#xff0c;实验设计与仿真是一个至关重要的环节。它不仅涉及到如何构建模型&#xff0c;还包括如何设置实验参数、运行仿真以及分析仿真结果。本节将详细介绍如何在GENESIS中进行实验设计与仿真&#xff0c;包括模型构建、参数设置、仿…

作者头像 李华
网站建设 2026/3/18 8:22:16

【 例 1】石子合并(信息学奥赛一本通- P1569)

【题目描述】 将 n 堆石子绕圆形操场排放&#xff0c;现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆&#xff0c;并将新的一堆的石子数记做该次合并的得分。 请编写一个程序&#xff0c;读入堆数 n 及每堆的石子数&#xff0c;并进行如下计算&#xff1…

作者头像 李华
网站建设 2026/4/3 5:17:12

Bash学习笔记总目录

shell编程是 Linux / 服务器运维、开发的基础技能&#xff0c;处理系统级任务更简洁、无环境依赖。将重复的操作自动化&#xff0c;大幅降低手动操作成本。 Bash是日常工作中用得较多的工具&#xff0c;之前也看过基本shell编程的书&#xff0c;或零星的查看帮助和文档。但一直…

作者头像 李华