当前位置: 首页 > article >正文

ES6+中Promise 中错误捕捉详解——链式调用catch()或者async/await+try/catch

通过 unhandledrejection 捕捉未处理的 Promise 异常手动将其抛出,最终让 window.onerror 捕捉,从而统一所有异常的处理逻辑
规范代码:catch(onRejected)async...await+try...catch

在 JavaScript 的 Promise 中,错误是否会影响外部代码的执行,取决于是否通过 .catch() 方法或 try/catch 主动捕获错误。以下是详细分析:

一、Promise 内部错误的默认行为

未捕获的 Promise 错误不会影响外部代码执行

Promise 内部的错误(如 reject() 或 throw)如果没有被 .catch() 捕获不会传播到外部的同步代码或全局作用域,外部代码(如 setTimeout、console.log 等)会继续执行。
示例:

     const p = new Promise((resolve, reject) => {reject(new Error("内部错误")); // 未捕获});setTimeout(() => console.log("外部代码执行"), 1000); // 仍会输出

现象:控制台会打印 Uncaught (in promise) Error: 内部错误,但 setTimeout 回调仍会执行。

Node.js 的全局处理机制

Node.js 中,未捕获的 Promise 拒绝会触发 unhandledRejection 事件,但默认不会终止进程(退出码仍为 0)。未来版本可能直接终止进程并返回非零退出码。

二、错误如何传递到外部?

主动使用 .catch() 捕获错误

通过链式调用 .catch(),可以捕获 Promise 链中任何位置的错误并阻止错误传播到外部

  someAsyncFunction().then(() => { / 成功逻辑 / }).catch((err) => {console.error("捕获错误:", err); // 错误在此处理});

未捕获的异步错误会冒泡到全局

如果错误在 异步操作(如 setTimeout) 中抛出,则会被视为全局未捕获错误:

   new Promise((resolve) => {setTimeout(() => { throw new Error("异步错误"); // 会被全局捕获}, 0);});

try/catch 无法捕获 Promise 内部错误

Promise 的错误是异步的,传统的 try/catch 无法捕获其内部错误:

   try {new Promise((resolve, reject) => {reject(new Error("错误"));});catch (err) {console.log("这里不会执行"); // 无效}

三、最佳实践

始终添加 .catch()

在 Promise 链末尾添加 .catch(),避免未捕获的拒绝:

 fetchData().then(processData).catch((err) => console.error("全局捕获:", err));

结合 async/await 和 try/catch

使用 async/await 时,可通过 try/catch 捕获错误:

   async function main() {try {const data = await fetchData();catch (err) {console.error("捕获错误:", err);}

全局错误监听(Node.js)

监听 unhandledRejection 事件处理未捕获的 Promise 错误:

    process.on("unhandledRejection", (err) => {console.error("未处理的 Promise 拒绝:", err);});

四、总结

默认行为:Promise 内部的未捕获错误不会影响外部代码执行,但会导致控制台警告

主动处理:必须通过 .catch()async/await + try/catch 捕获错误。

全局影响:在 Node.js 中,未捕获的 Promise 拒绝可能影响进程退出码(未来版本)。


这是一个非常经典的问题,涉及 Promise 的错误处理机制同步 vs 异步代码的差异


🔍 问题描述:

你发现:

  • async/await + try/catch 能捕捉错误 ✅
  • 但用 传统 try/catch 包裹一个 await 的 Promise,却无法捕捉错误

async/await + try/catch 可以捕捉错误的例子:

async function example() {try {await Promise.reject(new Error("出错了"));} catch (err) {console.log("捕获错误:", err.message);}
}
example();

输出:

捕获错误: 出错了

❌ 用普通 try/catch 包裹 Promise 不会捕获:

try {Promise.reject(new Error("出错了"));
} catch (err) {console.log("捕获错误:", err.message);
}

什么都不会输出!


🧠 原因解释:

1. try/catch 只能捕捉“同步”代码抛出的异常

JavaScript 中,try/catch 是同步的控制结构:

try {throw new Error("同步错误");  // ✅ 能捕捉
} catch (e) {console.log("同步捕捉:", e.message);
}

Promise 错误是异步执行栈上的错误,一旦进入微任务队列或宏任务队列,就不再处于 try/catch 的同步作用域里了。


2. Promise 的错误在异步链中传播

下面这段代码中的错误是“异步的”:

Promise.reject(new Error("异步错误"));

即使你在外层加 try/catch,JavaScript 已经执行完当前同步栈,Promise 的 .then/.catchawait 的处理,是在下一轮微任务里发生的。


✅ 正确做法:两种方式捕捉 Promise 错误

方法 1:使用 .catch()

Promise.reject(new Error("出错了")).catch(err => console.log("用 .catch 捕获错误:", err.message));

方法 2:使用 await + try/catch

async function run() {try {await Promise.reject(new Error("出错了"));} catch (err) {console.log("用 async/await 捕获错误:", err.message);}
}

✅ 总结记忆:

方式能否捕获 Promise 错误原因
try/catch(同步)无法捕捉异步任务
.catch()专为 Promise 设计
async/await + try/catchawait 等待 Promise 结果,错误仍在同步作用域

如果你还想看运行栈图或者事件循环流程,我也可以帮你画图解释 😄


在这里插入图片描述
在这里插入图片描述

相关文章:

ES6+中Promise 中错误捕捉详解——链式调用catch()或者async/await+try/catch

通过 unhandledrejection 捕捉未处理的 Promise 异常,手动将其抛出,最终让 window.onerror 捕捉,从而统一所有异常的处理逻辑 规范代码:catch(onRejected)、async...awaittry...catch 在 JavaScript 的 Pro…...

CDN安全加速:HTTPS加密最佳配置方案

CDN安全加速的HTTPS加密最佳配置方案需从证书管理、协议优化、安全策略到性能调优进行全链路设计,以下是核心实施步骤与注意事项: ​​一、证书配置与管理​​ ​​证书选择与格式​​ ​​证书类型​​:优先使用受信任CA机构颁发的DV/OV/EV证…...

解常微分方程组

Euler法 function euler_method % 参数设置 v_missile 450; % 导弹速度 km/h v_enemy 90; % 敌艇速度 km/h % 初始条件 x0 0; % 导弹初始位置 x y0 0; % 导弹初始位置 y xe0 120; % 敌艇初始位置 y t0 0; % 初始时间 % 时间步长和总时间 dt 0.01; % 时间步长 t_final …...

C++实现汉诺塔游戏自动完成

目录 一、汉诺塔的规则二、数学递归推导式三、步骤实现(一)汉诺塔模型(二)递归实现(三)显示1.命令行显示2.SDL图形显示 四、处理用户输入及SDL环境配置五、总结六、源码下载 一、汉诺塔的规则 游戏由3根柱子和若干大小不一的圆盘组成,初始状态下,所有的…...

在 ABP VNext 中集成 Serilog:打造可观测、结构化日志系统

🚀 在 ABP VNext 中集成 Serilog:打造可观测、结构化日志系统 📚 目录 🚀 在 ABP VNext 中集成 Serilog:打造可观测、结构化日志系统1. 为什么要使用结构化日志? 🤔2. 核心集成步骤 &#x1f6e…...

pikachu靶场通关笔记07 XSS关卡03-存储型XSS

目录 一、XSS 二、存储型XSS 三、源码分析 四、渗透实战 1、输入mooyuan试一试 2、注入Payload 3、查看数据库 4、再次进入留言板页面 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到XSS风险的…...

GitLab CI、GitHub Actions和Jenkins进行比较

特性/工具JenkinsGitLab CIGitHub Actions架构设计哲学Master/Agent分布式架构,通过插件扩展功能代码与CI/CD强耦合,内置Git仓库,基于Runner注册机制事件驱动,与GitHub深度集成,基于虚拟机的Job执行单元核心运行机制支…...

strcat及其模拟实现

#define _CRT_SECURE_NO_WARNINGS strcat 追加字符串 str "string"(字符串) cat "concatenate"(连接 / 追加) char* strcat(char* destination, const char* source); strcat的应用 方法一&#xff…...

OpenCV CUDA模块直方图计算------用于在 GPU 上执行对比度受限的自适应直方图均衡类cv::cuda::CLAHE

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::CLAHE 是 OpenCV 的 CUDA 模块中提供的一个类,用于在 GPU 上执行对比度受限的自适应直方图均衡(Contrast Limi…...

华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

通义开源视觉感知多模态 RAG 推理框架 VRAG-RL:开启多模态推理新时代

通义实验室的自然语言智能团队,凭借深厚的技术积累与创新精神,成功研发并开源了视觉感知多模态 RAG 推理框架 VRAG-RL,为 AI 在复杂视觉信息处理领域带来了重大突破。 传统 RAG 方法的局限 传统的检索增强型生成(RAG&#xff0…...

爬虫入门:从基础到实战全攻略

🧠 一、爬虫基础概念 1.1 爬虫定义 爬虫(Web Crawler)是模拟浏览器行为,自动向服务器发送请求并获取响应数据的一种程序。主要用于从网页中提取结构化数据,供后续分析、展示或存储使用。 1.2 爬虫特点 数据碎片化&…...

qemu安装risc-V 64

参考这篇文章https://developer.aliyun.com/article/1323996,其中在wsl下面安装可能会报错环境变量中有空格。 # clean_path.sh#!/bin/bash# 备份旧 PATH OLD_PATH"$PATH"# 过滤掉包含空格、制表符、换行的路径 CLEAN_PATH"" IFS: read -ra PA…...

JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.

最近为一个spring-boot项目下了mysql-9.3.0,结果因为mysql版本太新一直报错连不上。 错误如下: 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…...

AsyncIOScheduler与BackgroundScheduler的线程模型对比

1. BackgroundScheduler的线程机制‌ ‌多线程模型‌:BackgroundScheduler基于线程池执行任务,默认通过ThreadPoolExecutor创建独立线程处理任务,每个任务运行在单独的线程中,主线程不会被阻塞。‌适用场景‌:适合同步…...

Python+MongoDb使用手册(精简)

这里是学了下面链接的内容,加上一些自己学习的内容综合的,大家也可以去看看这篇文章,写的特别好 【python】在Python中操作MongoDB的详细用法教程与实战案例分享_python轻松入门,基础语法到高阶实战教学-CSDN专栏 1 库&#xff1…...

前端面经 协商缓存和强缓存

HHTTPTTP缓存 协商缓存和强缓存 核心区别是否向服务器发起请求验证资源过期 强缓存 浏览器直接读取本地缓存,不发请求 HTTP响应头 Cache-Control:max-age3600资源有效期 Expires优先级低 如果有效浏览器返回200(浏览器换伪造的200) 应用静态资源 协商缓存 OK如果 1强缓…...

MacOS安装Docker Desktop并汉化

1. 安装Docker Desktop 到Docker Desktop For Mac下载对应系统的Docker Desktop 安装包,下载后安装,没有账号需要注册,然后登陆即可。 2. 汉化 前往汉化包下载链接下载对应系统的.asar文件 然后将安装好的文件覆盖原先的文件app.asar文件…...

Centos系统搭建主备DNS服务

目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…...

VUE项目部署IIS服务器手册

IIS部署Vue项目完整手册 📋 目录 基础概念准备工作Vue项目构建web.config详解IIS部署步骤不同场景配置常见问题实用配置模板 基础概念 Vue单页应用(SPA)工作原理 重要理解:Vue项目是单页应用,这意味着:…...

使用 HTML + JavaScript 实现在线考试系统

在现代的在线教育平台中,在线考试系统是不可或缺的一部分。本文将通过一个完整的示例,演示如何使用 HTML、CSS 和 JavaScript 构建一个支持多种题型的在线考试系统。 效果演示 项目概述 本项目主要包含以下核心功能: 支持4种常见题型&…...

谷歌工作自动化——仙盟大衍灵机——仙盟创梦IDE

下载地址 https://chromewebstore.google.com/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd https://chrome.zzzmh.cn/info/mooikfkahbdckldjjndioackbalphokd...

嵌入式(C语言篇)Day13

嵌入式Day13 一段话总结 文档主要介绍带有头指针和尾指针的单链表的实现及操作,涵盖创建、销毁、头插、尾插、按索引/数据增删查、遍历等核心操作,强调头插/尾插时间复杂度为O(1),按索引/数据操作需遍历链表、时间复杂度为O(n),并…...

Oracle 的V$LOCK 视图详解

Oracle 的V$LOCK 视图详解 V$LOCK 是 Oracle 数据库中最重要的动态性能视图之一,用于显示当前数据库中锁的持有和等待情况。 一、V$LOCK 视图结构 列名数据类型描述SIDNUMBER持有或等待锁的会话标识符TYPEVARCHAR2(2)锁类型标识符ID1NUMBER锁标识符1(…...

秒杀系统—1.架构设计和方案简介

大纲 1.秒杀系统的方案设计要点 2.秒杀系统的数据 页面 接口的处理方案 3.秒杀系统的负载均衡方案底层相关 4.秒杀系统的限流机制和超卖问题处理 5.秒杀系统的异步下单和高可用方案 1.秒杀系统的方案设计要点 (1)秒杀促销活动的数据处理 (2)秒杀促销活动的页面处理 (…...

基于FashionMnist数据集的自监督学习(生成式自监督学习AE算法)

目录 一,生成式自监督学习 1.1 简介 1.2 核心思想 1.3 常见算法 1.3.1 自动编码器(Autoencoder) 1.3.2 生成对抗网络(GANs) 1.3.3 变分自编码器(VAE) 1.3.4 Transformer-based 模型&…...

从监控到告警:Prometheus+Grafana+Alertmanager+告警通知服务全链路落地实践

文章目录 一、引言1.1 监控告警的必要性1.2 监控告警的基本原理1.2.1 指标采集与存储1.2.2 告警规则与触发机制1.2.3 多渠道通知与闭环 二、技术选型与架构设计2.1 为什么选择 Prometheus 及其生态2.1.1 Prometheus 优势分析2.1.2 Grafana 可视化能力2.1.3 Alertmanager 灵活告…...

AUTOSAR图解==>AUTOSAR_EXP_AIADASAndVMC

AUTOSAR高级驾驶辅助系统与车辆运动控制接口详解 基于AUTOSAR R22-11标准的ADAS与VMC接口规范解析 目录 1. 引言2. 术语和概念说明 2.1 坐标系统2.2 定义 2.2.1 乘用车重心2.2.2 极坐标系统2.2.3 车辆加速度/推进力方向2.2.4 倾斜方向2.2.5 方向盘角度2.2.6 道路变量2.2.7 曲率…...

WPF【09】WPF基础入门 (三层架构与MVC架构)

9-2 【操作】WPF 基础入门 新建一项目 Create a new project - WPF Application (A project for creating a .NET Core WPF Application) - Next - .NET 5.0 (Current) - Create 项目创建完成,VS自动打开 GUI用户界面,格式是 .xaml文件,跟xm…...

macOS 风格番茄计时器:设计与实现详解

macOS 风格番茄计时器:设计与实现详解 概述 本文介绍一款采用 macOS 设计语言的网页版番茄计时器实现。该计时器完全遵循苹果的人机界面指南(HIG),提供原汁原味的 macOS 使用体验,同时具备响应式设计和深色模式支持。 核心特性 原生 macOS…...