try catch不能捕获promise的错误

参考链接
try catch不是万能的,不能捕获promise的错误。但可以promise接catch来捕获错误,如果有多层的promise,每层都要加catch。
代码示例

// 捕获失败
try {new Promise((resolve,reject)=>{throw Error(1)})
} catch (e) {console.error('catch error')
}// 能捕获
try {new Promise((resolve,reject)=>{throw Error(1)}).catch(e=>{console.error('error catch!')})
} catch (e) {console.error('catch error', e)
}// 多层 不能
try {new Promise((resolve,reject)=>{return new Promise(()=>{throw new Error(1)})}).catch(e=>{console.error('error catch!')})
} catch (e) {console.error('catch error', e)
}// 每层都catch,然后reject外抛,能捕获
try {new Promise((resolve,reject)=>{return new Promise(()=>{throw new Error(1)}).catch(e=>{return reject(e)})}).catch(e=>{console.error('error catch!')})
} catch (e) {console.error('catch error', e)
}

这里的原理是啥?
参考这里,promise的executor里(就是这里)默认有个try catch,当有异常时就会执行reject并把异常作为参数。

我们知道try catch能捕获try代码块的异常,但如果异常在promise里抛出,那异常不是立即执行的,而是调用了reject,而reject是加到microtask里执行的,详细可以了解下javascript的event loop机制
比如如下代码

console.log(1)
new Promise((resolve) => {console.log(2)throw Error(4)
}).then((e) => { console.log(e) })
console.log(3)

会输出1、2、3后,再抛出异常4。到异常4的时候,已经不在try catch的marcotask了,try catch里的部份已经执行完了,而是在microtask里处理这个异常,所以捕获不了

console.log(1)
new Promise((resolve) => {console.log(2)throw Error(4)
}).catch(e=>{console.warn(e)})
console.log(3)

所以这样能捕获

这样也可以

new Promise(r=>{try{eee} catch(e){console.warn(e)}
})
// ReferenceError: eee is not defined

但这样不行,同理setTimeout异步执行的,try里面的代码实际已经跑完了

try {setTimeout(()=>{eee})
}catch(e) {console.warn(e)
}

还有一种方法也能捕获,加上await

async function getSomeValue() {throw new Error('uh oh');
}async function a() {try {const someValue = await getSomeValue();} catch (error) {console.warn(error);}
}

await是等待promise resolve或reject后才继续执行之后的代码,那为啥在外面加try catch就能捕获到?是因为执行又回到macrotask了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精通正则表达式 - 打造高效正则表达式

目录 一、典型示例 1. 稍加修改——先迈最好使的腿 2. 效率 vs 准确性 3. 继续前进——限制匹配优先的作用范围 4. “指数级”匹配 二、全面考察回溯 1. 传统 NFA 的匹配过程 2. POSIX NFA 需要更多处理 3. 无法匹配时必须进行的工作 4. 看清楚一点 5. 多选结构的代…

测试用例实战

测试用例实战 三角形判断 三角形测试用例设计 测试用例编写 先做正向数据,再做反向数据。 只要有一条边长为0,那就是不符合要求,不需要再进行判断,重复。 四边形 四边形测试用例

安装交叉编译工具链aarch64-linux-gnu-g++ 以及cmake测试

(一)交叉编译工具链安装 # 查看可以安装的版本 apt-cache search aarch64 # 选择可以安装的版本进行安装 # 此处选择gcc-5-aarch64-linux-gnu以及g-5-aarch64-linux-gnu进行安装 sudo apt-get install gcc-5-aarch64-linux-gnu  sudo apt-get install …

HDFS的文件块大小(重点)

HDFS 中的文件在物理上是分块存储 (Block ) , 块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。 如果一个文件文件小于128M,该文件会占…

Python实战案例:轻松采集微博评论,揭示网络舆论热点!

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境: python 3.8: 解释器 pycharm: 代码编辑器 模块使用: requests: 发送请求 parsel: 解析数据 jieba pandas stylecloud 第三方模块安装: win R 输入cmd 输入安装命令 pip install 模块名 (如果你…

uniapp 条件编译失败,跑不起来

因为这行代码整个uniapp都跑不起来&#xff0c;谁懂救命。再说uniapp的异常提示也太反人类了<!-- <image :src"require(/ baseListItem.url)" /> -->

没有accept还能建立tcp连接吗?

首先什么是accept&#xff1f;以下是常见的接收网络请求的伪代码 int main() {/*Step 1: 创建服务器端监听socket描述符listen_fd*/ listen_fd socket(AF_INET, SOCK_STREAM, 0);/*Step 2: bind绑定服务器端的IP和端口&#xff0c;所有客户端都向这个IP和端口发送和请求数…

[工具|软件使用] VSCode查看正在运行查询插件

在VSCode中&#xff0c;你可以使用"Developer: Show Running Extensions"命令来查看当前运行的所有插件。 以下是在VSCode中查看插件CPU占用的步骤&#xff1a; 打开VSCode&#xff0c;确保你的编辑器正常运行。 按下Ctrl Shift P&#xff08;在Mac上是Cmd Shif…

高精度地图服务引擎项目

技术栈&#xff1a;使用vue3TypeScriptElement PlusPiniaaxios 项目描述&#xff1a;高精度地图服务引擎项目&#xff0c;提供轻量化处理3D瓦片切片分布式处理分发服务的一站式解决方案 工作内容&#xff1a;1、项目60%已上的页面开发 2、部分模块的功能实现&#xff0c; 3、封…

LT6911C 是一款HDMI 1.4到双端口MIPIDSI/CSI或者LVDS加音频的一款高性能芯片

LT6911C 1.描述&#xff1a; LT6911C是一款高性能的HDMI1.4到MIPIDSI/CSI/LVDS芯片&#xff0c;用于VR/智能手机/显示器应用程序。对于MIPIDSI/CSI输出&#xff0c;LT6911C具有可配置的单端口或双端口MIPIDSI/CSI&#xff0c;具有1个高速时钟通道和1个~4个高速数据通道&#…

Flask 笔记

Flask 笔记 一、Flask介绍 1、学习Flask框架的原因 2020 Python 开发者调查结果显示Flask和Django是Python Web开发使用的最主要的两个框架。 2、Flask介绍 ​ Flask诞生于2010年&#xff0c;是Armin ronacher用Python 语言基于Werkzeug工具箱编写的轻量级Web开发框架。 ​…

24 ==比较的是地址在.equals比较的是内容

public class Demo1 {public static void main(String[] args) {byte[] arr {97,98,99};String s1 new String(arr);String s2 new String(arr);System.out.println(s1s2);System.out.println(s1.equals(s2));} }

【云原生】Kubernetes之ConfigMap

ConfigMap ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件 ConfigMap 将你的环境配置信息和 容器镜像 解耦&#xff0c;便于应用配置的修改 说明&#xff1a;…

Ubuntu16.04LTS安装ROS测试小海龟样例

一、参考资料 在Ubuntu中安装ROS Kinetic ROS安装ubuntu16.04 无需科学上网解决sudo rosdep init初始化问题 二、安装ROS关键步骤 1. 选择ROS版本 ROS安装选择 Ubuntu版本不同&#xff0c;对应安装的ROS版本也不同&#xff0c;务必版本对齐。 本文以Ubuntu16.04LTS系统为例…

工作不要当老黄牛

1&#xff0c;员工需要帮上级分忧&#xff0c;不论上级是不是老板。很多时候上级就是经理、总监&#xff0c;本质上他也只是一个卑微普通的打工人&#xff1b; 2&#xff0c;对上级的态度不能是掏心掏肺&#xff0c;应该是尽心尽力。掏心掏肺和尽心尽力的区别是&#xff1a;全身…

MonoBehaviour 组件

MonoBehaviour 组件是指继承了 MonoBehaviour 类的脚本组件&#xff0c;可以附加到游戏对象上&#xff0c;用于控制游戏对象的行为和交互。 MonoBehaviour 类是 Unity 中的一个基类&#xff0c;提供了许多方法和事件&#xff0c;用于处理输入、渲染、碰撞、协程等操作。 Unity…

C盘空间不足:解决办法完整教程

当C盘空间不足时&#xff0c;你可以尝试以下几种解决方案&#xff1a; 1. 清理临时文件&#xff1a;使用Windows自带的磁盘清理工具&#xff0c;可以删除临时文件、回收站中的文件和其他不必要的系统文件&#xff0c;释放一些空间&#xff0c;推荐使用工具分区助手。 2. 卸载不…

React 框架下自己写一个braft编辑器,然后将编辑器内容展示在网页端

1.首先自己写一个编辑器 输入文字&#xff1b; 支持选择表情&#xff1b; 可添加小程序链接&#xff1b;可添加网页链接&#xff1b;并且可以编辑删除&#xff1b;效果如下 2.输入完毕后&#xff0c;点击文本输入框保存&#xff0c;将便携式内容回显&#xff0c; 渲染时…

[MySQL]MySQL用户管理

[MySQL]MySQL用户管理 文章目录 [MySQL]MySQL用户管理1. 用户的概念2. 用户信息3. 创建用户4. 修改用户密码5. 删除用户6. MySQL中的权限7. 给用户授权8. 回收权限 1. 用户的概念 MySQL中的用户分为超级用户&#xff08;root&#xff09;和普通用户。超级用户的操作是不受权限…

机器人制作开源方案 | 智能垃圾桶

1. 功能说明 智能垃圾桶是一种利用物联网技术和智能感知能力的智能设备&#xff0c;旨在提高垃圾分类和处理的效率。通常具备以下特点和功能&#xff1a; ① 智能感知&#xff1a;智能垃圾桶配备各种传感器&#xff0c;如压力传感器、红外线传感器等&#xff0c;可以实时感知…