稳定性建设之JavaScript代码不能被阻断

news2025/1/12 6:15:19

稳定性建设之JavaScript代码不能被阻断

背景

js代码可能会因为某些原因,导致出错,进而整个后续代码有可能都被阻断。直接影响线上的稳定性

最常见的js被阻断的情况

console.log(111)
// 预期 a = {}
// 结果
a = undefined
a.a = 1
console.log(222) // js代码不能执行到这一行 

这个代码很明显会报错,在a.a = 1这一行开始报错,后续的js代码被阻断了,console.log(222)打印不出来

解决办法

  • 解决办法也很简单,用 try…catch… 捕获住错误就好了
console.log(111)
try {// 预期 a = {}// 结果a = undefineda.a = 1
} catch (e) {console.error(e)
}
console.log(222) // js代码可以执行到这一行 

容易被我们忽视的点

1. 没考虑到错误上报

  • 上面的demo没有考虑错误上报,发生错误时,外部根本捕获不到(即使你接入了sentry类的产品),因为error被try catch给吃掉了
try {// 预期 a = {} // 结果 a = undefined a.a = 1
} catch (e) {console.error(e)// 公司内部的上报函数someReportFunction('sendEvent', {name: 'try_catch_error',params: {errorMsg: e.message,errorStack: e.stack},});
} 

2. 错用throw

随便点开一篇文章,就有人在误人子弟,教别人用 throwthrow这个东西是不能乱用的,因为他会阻断代码,重要的事情说三遍,throw会阻断代码,throw会阻断代码,throw会阻断代码

例如:

console.log(111)
try {// 预期 a = {}// 结果a = undefineda.a = 1
} catch (e) {console.error(e)throw e // throw会阻断代码,导致下面不执行
}
console.log(222) // 不能执行到这一行 

当然throw也不是一无是处,但是,他只能在try{ 里面使用 },不能在try之外的地方使用throw,包括catch

console.log(111)
try {throw new Error(111)
} catch (e) {console.error(e)
}
console.log(222) 
function getData () {if (...) {...} else {throw new Error(111)}
}
console.log(111)
try {getData()
} catch (e) {console.error(e)
}
console.log(222) 

3. 异步代码catch不到,还是会被阻断

console.log(111111111)
try {setTimeout(() => {a = undefineda.a = 1 // 代码被阻断于此console.log('error') // 不能执行到这一行}, 0)
} catch (e) {console.error(e) // 异步代码catch不到
}
console.log(222222222)

setTimeout(() => {console.log('setTimeout') // 浏览器可以执行到这一行,node的不行(node14和16版本都test了)
}, 2000) 

4. import()和require()的错误捕获表现不一致

// a.js
console.log(111111111)
try {require('./b.js')
} catch (e) {console.log('error') // 错误会被正常catch到console.error(e)
}
console.log(222222222)

setTimeout(() => {console.log('setTimeout')
}, 2000)

// b.js
console.log(1)
a = undefined
a.a = 1
console.log(2)

// 结果打印 (require被正常捕获)
111111111
1
error
TypeError: Cannot set property 'a' of undefined......
222222222
setTimeout 
  • 同样的代码换成,import()
// a.js
console.log(111111111)
try {import('./b.js')
} catch (e) {console.log('error') // 错误没有被catch到console.error(e) 
}
console.log(222222222)

setTimeout(() => {console.log('setTimeout')
}, 2000)

// b.js
console.log(1)
a = undefined
a.a = 1
console.log(2)

// 结果打印 (import的 错误没有被catch到)
111111111
222222222
1
(node:92673) UnhandledPromiseRejectionWarning: TypeError: Cannot set property 'a' of undefined...
setTimeout 
  • 正确捕获import()的方式:其实import()是一个promise,用promise的方法去catch就好了import('./b.js') .catch(e => { console.log('error') console.error(e) }) 结论:

  • try catch 不能捕获import()模块的错误,require可以被捕获

  • import() 用promise的方法去catch就好了

背景:

  • require是运行时加载(可以理解为,函数调用)
  • import()是动态import,会延迟加载,是异步任务(微任务),是promise

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Pycharm的简单介绍以及api的使用

一、什么是Pycharm? Pycharm是一种python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、脚本控制。此外,该IDE提供了一些高级功…

MyBatis-Plus中自动填充功能的用法

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus之ActiveRecord[基础增删改查操作]_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询(快速上…

【JavaWeb开发-Servlet】day06-学生成绩管理系统-实现分页功能

目录 一、前端设计 二、分页功能 ①创建实体层 ②在DAO层新建两个方法 ③编写业务层 ④实现Servlet层 ⑤修改前端页面 ⑥测试 ⑦思路 ⑧扩展 一、前端设计 原来的前端非常简陋,没有明显的突出其功能,下面将对前端页面进行新的完善。 写一个标题…

HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺

小编今天和大家一起来学习HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺相关研究内容! 光克洛,第二代的光敏剂,可用于光动力疗法 (PDT),基本结构为二氢卟吩类化合物。美国研究人员从绿色植物中提取、纯化&…

nginx笔记

作者:ThinkStu 文章目录一、简介二、常用配置1、listen2、server_name3、location4、sendfile5、nodelay/push6、add_header7、set 变量8、if9、return10、keepalive三、常用操作1、Gzip压缩2、正则表达式3、rewrite重写4、rewrite范例5、跨域6、防盗链7、适配移动设…

R语言数据可视化分析案例:探索BRFSS数据

最近我们被客户要求撰写关于BRFSS数据的研究报告,包括一些图形和统计输出。 加载包 library(tidyr) library(knitr) opts_chunk$set(echo TRUE, fig.align "center") 载入资料 load("brfss2013.RData")第1部分:数据 描述如何收…

Spring Boot ActuatorAdmin

Spring Boot Actuator&Admin 指标监控简介 干嘛的: 主要运用在微服务架构,所以我建议你先学微服务,否则可能get不到它的用处,只有大型的分布式系统才会用到指标监控… Why:? 对于一个大型的几十个、…

低代码如何自定义主题?一文教会你

SuccAP低代码开发平台,除了提供了多主题供选择外,还支持自定义报表主题,当系统自带的主题无法满足项目需求时,可以根据项目设计并新增主题,本文将介绍如何去新增自定义主题。 新增自定义主题可按如下步骤操作&#xf…

APS高级计划排程在乳制品行业的应用

目前乳制品行业供应链管理中存在的主要问题 生产盲目性,应对市场变化能力不足。现如今牛奶已经成为人们日常饮食需求的必需品,很多生产厂家就开始大量的生产,全然不顾市场的需求度,应对市场变化的能力不足,导致了有一…

计算机毕业设计ssm+vue基本微信小程序的心理服务平台 uniapp 小程序

项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中。传统模式的青少年心理健康管理满足不了现代人的生活追求,服务质量、服务速度,之前的很多网站由于功能、或者框架设计等原因,无法完美的展现它的特色,优势,浪费了很多资源。使用管理系统进行…

今天步行数5000多

今天步行数量比较多的,有五千多步吧,希望明天能继续保持下去。

企业知识分享系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…

两种方案解决vscode浏览器跨域问题

一、 问题 1.1 在接收 json 数据的时候出现了以下错误; 打开测试用的 json 文件发现数据并没有问题,而第一个报错可以看到 Cross origin requests are only supported for protocol schemes:… ,也就是说所使用的数据不在跨域的许…

毕业后5年,我终于变成了月薪13000的软件测试工程师

目录 我为什么选择转行 工作环境 我选择了转行软件测试 写在最后 《软件测试工程师发展规划路线》 一、测试基础 了解测试的基础技能,掌握主流缺陷管理工具的使用,熟练测试环境的操作与运维 二、Linux必备知识 Linux作为现在最流行的软件环境系…

场景案例│数字员工助力医疗行业打通信息系统壁垒,实现高效率运营

据埃森哲研究预测,到2026年人工智能技术每年将为医疗保健行业节省1500亿美元。 随着人们对数字化的需求日益增长,数字技术成为转型升级的新兴力量,许多医疗机构积极采用数字员工推进数字化转型的步伐。 在数字员工的支持下,医疗…

Redis Replication

高可用架构-Redis Replication 今天学习下如何基于Redis 复制功能构建高可用架构-主从复制,Redis Replication 支持数据复制和故障切换。Redis复制是允许Redis实例完全复制主实例的过程。默认情况下,复制是一个异步过程。Redis复制在主机端和副本端都是…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业设计选题档案管理系统bvr3c

毕业设计其实不难,主要毕业的时候任务太紧了,所以大家都非常忙没有时间去做,毕业设计还是早做准备比较好,多花点时间也可以做出来的,建议还是自己动手去做,比如先选一个题,这样就有方向&#xf…

Flutter实现文件上传华为对象存储(OBS)

本文主要讲述在 Flutter 项目中如何实现将文件上传到华为 OBS(对象存储)中,并封装为三方库方便灵活使用。 背景介绍 在大多项目中都会存在文件上传的需求,之前的实现都是调用后台的文件上传接口将文件上传到服务器上,…

从投资人发现“新大陆”,看“产融星城”为何成?

文丨熔财经 作者|陈小江 “我从来不把《我要投资》节目看作是秀(综艺),要知道《我要投资》是在前面的,秀(综艺)只是一种形式而已。本质上,(参加节目)还是为了投资”。 …

「Redis数据结构」跳跃表(SkipList)

「Redis数据结构」跳跃表(SkipList) 文章目录「Redis数据结构」跳跃表(SkipList)一、概述二、结构跳跃表节点跳跃表三、特点一、概述 跳表(SkipList,全称跳跃表)是用于有序元素序列快速搜索查找…