不要在代码中随便使用try...catch了

前言

 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步!

 🍅 个人主页:南木元元


目录

背景

js中的try...catch

try...catch运行机制

js的事件循环机制

try...catch无法捕获异步错误的原因

解决方法

结语


背景

之前面某物的时候,遇到了一个有关try...catch的问题,让我印象深刻,这里来记录分享一下。

面试官:下面代码有什么问题吗?

示例1:

try {setTimeout(() => {throw new Error('err');}, 200);
} catch (err) {console.log(err);
}

示例2:

try {Promise.resolve().then(() => {throw new Error('err');});
} catch (err) {console.log(err);
}

第一反应是,这不就是一个普通的try...catch捕获错误吗?但其实是有坑在里面的。

js中的try...catch

js中的try...catch是平时写代码时经常会使用的,它可以捕获代码中的异常并防止应用程序崩溃

try {// 可能会抛出异常的代码
} catch(error) {// 处理所有异常的代码
}

但try...catch并不能捕获所有的异常,这就需要了解try...catch的运行机制,这样才能保证我们合理地去使用它。

try...catch运行机制

当程序运行到try...catch里面时:

  • 如果未报错,则会忽略catch中的代码
  • 若报错,则不执行try报错内容后面的代码,转而执行catch中的代码

总结一下,能被try...catch捕捉到的异常,必须是在报错的时候,线程执行已经进入try...catch 代码块,且处在 try...catch 里面,这个时候才能被捕捉到。

js的事件循环机制

js是单线程语言,事件循环是js的执行机制。

  1. 所有同步任务都在主线程上执行,形成一个执行栈
  2. 在执行同步任务的时候,如果遇到了异步事件,会将该任务挂起,继续执行同步任务,当异步事件执行完后(如定时器到时,ajax请求返回),再将对应的回调加入到一个任务队列中等待执行,任务队列可以分为宏任务队列和微任务队列
  3. 当执行栈中的同步任务执行完毕后,会执行所有微任务,清空微任务队列
  4. 当执行完所有微任务后,再去执行宏任务队列中的下一个宏任务,不断循环,直到所有任务都完成。

这一套流程,就是事件循环。

错误原因

现在回到上述代码,其实就能够明白存在的问题是try...catch无法捕获异步错误

try...catch是同步执行的,而setTimeout和Promise.resolve()一个是宏任务,一个是微任务,都是异步任务,等到setTimeout和Promise.resolve()里面的事件进入到事件队列的时候,主线程已经离开了try...catch,所以try...catch无法捕获异步错误。

解决方法

只需在同步任务中使用try...catch即可,利用Promise和async/await的内在能力。

对于第一个示例:

new Promise((resolve, reject) => {setTimeout(() => {try {throw new Error('err');} catch (err) {reject(err);}}, 200); 
})
.then(() => {// 处理成功执行的情况
})
.catch((err) => {console.log(err); // 错误在这里被捕获
});

对于第二个示例:

// 方法一:使用Promise链式调用
Promise.resolve().then(() => {throw new Error('err');}).catch((err) => {console.log(err); // 错误在这里被捕获});// 方法二:使用async/await
async function handleError() {try {await Promise.resolve().then(() => {throw new Error('err');});} catch (err) {console.log(err); // 错误在这里被捕获}
}handleError();

结语

因此,在代码中不要再随便写try...catch了,异步错误是无法被捕获的,而且像Promise有它自己的异常捕获方法,比try...catch更好用。

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~ 

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

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

相关文章

grpc的验证器

简介 在使用grpc库时候 ,很多时候我们需要对反序列化的参数进行校验,代码中有很多参数校验的代码,如果手动实现,会非常繁琐,对于grpc来说,在定义proto的时候使用直接定义参数的限制规则是一种更合理、更优雅的方式,插…

人工智能迷惑行为大赏

近年来,随着人工智能技术的不断发展和应用,我们在日常生活中越来越多地接触到各种智能设备和程序。然而,随之而来的是一些令人瞠目结舌的人工智能迷惑行为,让人们对这一新兴技术产生了更多的好奇和思考。 在人工智能迷惑行为大赏…

「2024」不再内卷,让AI低代码带你玩点新花样!

这一次,OpenAI的不败传奇终于被撼动。 其强劲对手Anthropic于北京时间(2024年3月4日)震撼发布新一代AI大模型系列——Claude 3。 根据官方性能测试数据的展示,Claude 3系列模型在各项表现上均超越GPT-4,荣登全球最强…

基于yolov7与arduino的眼睛跟随模块

基于yolov7与arduino的眼睛跟随模块 整个模块的介绍摄像模块图片传输模块图像检测模块控制模块动力模块 整个模块的介绍 我们首先需要一个图片收集的模块来对当前的图片进行收集然后将图片传至服务端对图片中的眼睛利用YOLO进行检测最后将数据传至arduino使其控制动力模块来进…

小额投资者如何投资黄金?

天下熙熙,皆为利来。近来,无论是黄金还是英伟达,各有各的火爆,这引起了广泛新手投资者的关注,许多小白玩家也跃跃欲试。事实上,并非入场越久越可被称为成熟的投资者,投资并不限定于特定的资金规…

导出谷歌浏览器收藏的网页,并查看网页保存的登录密码

导出谷歌浏览器(Chrome)收藏的网页(书签): 打开谷歌浏览器。在浏览器右上角找到并点击三个垂直排列的小点(或称汉堡菜单)以打开主菜单。在下拉菜单中选择“书签” > “书签管理器”。在书签…

ms office学习记录9:Excel㈢

懒癌犯了拖了好几天的学习进度,下决心暂别娱乐,还是先把两门计算机二级过完!把该做的做到位了,剩下的考完再说。 以下为今日excel知识点总结: 条件格式的本质:把符合条件的信息设置特殊格式突出显示 双击…

不被折叠的朋友圈这样发

现在朋友圈折叠有两种:第一种是文案折叠,第二种是整条折叠。 说下现象、原因和解决办法。 01 文案折叠 现象:只有文字被折叠成一行,图片视频还能看到,其它内容看不到。 折叠原因:发布的内容在自己朋友圈…

Oracle数据恢复—Oracle被误删表不要慌!掌握如何恢复Oracle表!

Oracle数据库数据恢复环境: 北京某国企客户Oracle 11g R2数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,数据库的备份不可用,无法查询表数据。 Oracle数据库执行Truncate命令的原理&am…

快上车:人工智能的分类;机器学习的几种方式;神经网络神奇在哪里?

摘要: 本文深入探讨了人工智能的分类、机器学习的几种方式以及神经网络的神奇之处,为读者提供了丰富的技术知识和实践经验。 阅读时长:约60分钟 关键词:人工智能, 机器学习, 神经网络 引言 背景介绍 随着计算机技术的飞速发展…

SSM整合项目(使用Vue3 + Element-Plus创建项目基础页面)

1.配置Vue启动端口 1.修改vue.config.js const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true }) module.exports {devServer: {port: 9999 //启动端口} }2.启动 2.安装Element Plus 命令行输入 npm install eleme…

微信小程序购物/超市/餐饮/酒店商城开发搭建过程和需求

1. 商城开发的基本框架 a. 用户界面(Frontend) 页面设计:包括首页、商品列表、商品详情、购物车、下单界面、用户中心等。交云设计:如何让用户操作更加流畅,包括搜索、筛选、排序等功能的实现。响应式设计&#xff1…

python中怎样把一个文件夹中所有的*.ts文件拼接为.MP4文件?

你可以使用ffmpeg库来实现将一个文件夹中的所有*.ts文件拼接为一个.MP4文件。 首先,你需要确保已经安装了ffmpeg。然后,可以使用以下代码实现: import osdef concat_videos(input_folder, output_file):# 获取文件夹中所有的.ts文件ts_file…

群晖Synology Office本地文件如何分享给同事远程协作编辑【内网穿透】

文章目录 本教程解决的问题是:1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是: 1.Word,PPT,Excel等重要文件存在本地环境,如何在编…

访问一次网站的全过程

目录 流程图: 一、应用层开始 1. 在浏览器输入https://www.baidu.com 2. DNS获取IP地址 3. 根据HTTP协议生成HTTP请求报文 应用层结束 二、传输层开始 4. TCP三次握手 传输层结束 三、网络层开始 5. IP寻址 6. ARP协议获取MAC地址 网络层结束 四、数据…

CSS 02

1.复合选择器 &#xff08;1.1&#xff09;后代选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

ICLR 2024 | Meta AI提出ViT寄存器结构,巧妙消除大型ViT中的伪影以提高性能

论文题目&#xff1a;Vision Transformers Need Registers 论文链接&#xff1a;https://arxiv.org/abs/2309.16588 视觉Transformer&#xff08;ViT&#xff09;目前已替代CNN成为研究者们首选的视觉表示backbone&#xff0c;尤其是一些基于监督学习或自监督学习预训练的ViT&a…

【Java EE】线程安全的集合类

目录 &#x1f334;多线程环境使用 ArrayList&#x1f38d;多线程环境使⽤队列&#x1f340;多线程环境使⽤哈希表&#x1f338; Hashtable&#x1f338;ConcurrentHashMap ⭕相关面试题&#x1f525;其他常⻅问题 原来的集合类, 大部分都不是线程安全的. Vector, Stack, HashT…

小波散射网络及其应用

1989 年,Mallat 首次提出将基于小波变换的特征提取方法用于模式识别分类中[40],若干 年后,Mallat 又提出了基于小波变换的小波散射网络这一新型网络结构,该网络主要是基于 小波变换的散射算子(Scattering operators)[41],能提取出原始信息在弹性形变、仿射变换中 的不变…

智慧城市的定义是什么?

智慧城市&#xff1a;就是运用信息和通信技术手段感测、分析、整合城市运行核心系统的各项关键信息&#xff0c;从而对包括民生、环保、公共安全、城市服务、工商业活动在内的各种需求做出智能响应。其实质是利用**的信息技术&#xff0c;实现城市智慧式管理和运行&#xff0c;…