为了学会更多炫酷的 canvas 效果,我熬夜复习了三角函数相关的知识点

news2025/7/12 14:37:36

稳定性建设之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

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



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

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

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

相关文章

web前端期末大作业 HTML游戏资讯网页设计制作 简单静态HTML网页作品 DW游戏资讯网页作业成品 游戏网站模板

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

CTO职位刚发布,一天收到100+份简历

IT行业卷可是没有想到这么卷,我们公司最近招聘CTO,一天收到100份简历,这里面有太多优秀的人,简直挑花了眼。这里面有英国毕业的,有北京大学的,还有各种985和211毕业的大学生,简历也是非常的丰富…

总结717

大三上半学期过去了。回想起当初那个暑假还在纠结的问题。如今,我也算是想通了。 回想起这样一个夜晚,我与好几位同学在谈论考研的事情。其中有一位同学问:“所以,你们为什么要考研呢?”有的同学说是“想到名校走走”…

【C++常用容器】STL基础语法学习stack容器

目录 ●stack基本概念 ●stack常用接口 ●构造函数 ●赋值操作 ●数据存取 ●大小操作 ●stack基本概念 简要介绍: stack是一种先进后出或后进先出的数据结构,它只有一个出口。栈中只有顶端元素才可以被外界使用,因此栈不允许有遍历行为。栈…

对vue的mixin的理解,有什么应用场景?

mixin是什么 Mixin是面向对象程序设计语言中的类,提供了方法的实现。 其他类可以访问mixin类的方法而不必成为其子类 当一段代码非常相似的时候就可以抽离成一个mixin mixins是一个js对象,它可以包含我们组件中script项中的任意功能选项,…

不是所有国产软件都像360一样流氓!这些良心国产软件不该被埋没

提到国产软件,很多人第一反应——360安全卫士。 但就像那句著名点评:“电脑上的常见问题有一半是安装360可以解决的,另一半是卸载360可以解决的。” 360可以说让人又爱又恨,强大的杀毒能力毋庸置疑,但是捆绑安装也是…

java计算机毕业设计基于安卓Android的学生个人支出管理APP

项目介绍 基于APP的学生个人支出管理系统主要针对广大学生,本设计分为用户客户端和管理员后台管理,前台用户管理使用Android Studio制作,使用了JS、HTML和uniapp开发框架,后台管理使用JAVA:MySQL数据库来保存数据以及上传数据。MySQL体积小、速度快,为数据的存储和…

用Python机器人监听微信群聊, 我看谁这么大的胆子敢调侃老板和前台小姐姐!

随着微信社交的兴起,我们加入的群也越来越多,一个不经意就被拉入好几个群,群是大家协同交流的平台,但是微信群却越来越泛滥,不知道大家有没有统计过自己浪费在毫无营养的群中的时间? 因为群质量太低或者群太…

Web页面测试

一、Web的功能测试 1、超链接测试 a、链接与链接的说明文字要匹配 (注:也可以是图片) b、链接的文字要描述正确 c、链接的文字要精简有效 d、链接的页面应该存在,不应该出现404找不到页面的错误 e、没有孤立页面,只有…

Android kotlin 基础知识codelab Fragment Summary

创建 fragment 在此 Codelab 中&#xff0c;您向 AndroidTrivia 应用添加了一个 fragment&#xff0c;在本课的后续两个 Codelab 中您将继续在此应用中执行操作。 fragment 是 activity 的模块化部分。fragment 有自己的生命周期&#xff0c;会接收自己的输入事件。使用 <…

宝宝经常吐奶,除了拍嗝,这6个细节也不容忽视,别因小失大

众所周知&#xff0c;宝宝吐奶是很常见的。不过&#xff0c;虽然很常见&#xff0c;但只要宝宝吐奶&#xff0c;尤其是宝宝吐奶时&#xff0c;家长们都会非常心疼&#xff0c;迫不及待地想代替宝宝承受这些不适。为什么宝宝这么容易吐奶&#xff1f;首先&#xff0c;宝宝的胃是…

JQuery 基础

JQuery对象和JS对象区别与转换 1. JQuery对象在操作时&#xff0c;更加方便。 2. JQuery对象和js对象方法不通用的. 3. 两者相互转换 * jq -- > js : jq对象[索引] 或者 jq对象.get(索引) * js -- > jq : $(js对象) <script>//1.通过…

定时执行专家 —— 模拟键盘按键、鼠标单击功能发布(可发送快捷键、热键、鼠标左键多次单击)

目录 ◆ 定时执行专家 —— 模拟键盘按键 ◆ 定时执行专家 —— 模拟鼠标单击 ◆ 定时执行专家 —— 模拟键盘按键 - 设置方法 &#xff08;1&#xff09;点击 “定时执行专家” 工具栏 “新建” 图标&#xff0c;打开 “任务对话框”&#xff08;图1&#xff09;&#xff1…

Spring中的Bean的实例化

Bean的实例化1. Bean的配置2.Bean的实例化2.1 构造器实例化2.2 静态工厂方式实例化2.3 实例工厂方式实例化1. Bean的配置 Spring 可以被看作是一个大型工厂&#xff0c;这个工厂的作用就是生产和管理 Spring 容器中的Bean。如果想要在项目中使用这个工厂&#xff0c;就需要开发…

Android开发【全面理解Activity】

一、 Activity的生命周期 和其他手机 平台 的应用 程序 一样&#xff0c;Android的应用程序 的生命周期是被统一掌控 的&#xff0c;也就是说我们写的应用程序命运掌握在别人&#xff08;系统&#xff09;的手里&#xff0c;我们不能改变它&#xff0c;只能学习并适应它。 简…

一年一度的云计算春晚——亚马逊云科技re:Invent

一年一度的云计算春晚——亚马逊云科技re:Invent&#xff0c;近日盛大开幕。那么“云计算春晚”发布了什么AI产品&#xff1f; 首先来看Amazon SageMaker&#xff0c;今年是其发布的第五年&#xff0c;各行各业已有数百万个机器学习模型使用该服务管理&#xff0c;每月进行数千…

支付服务-----功能实现逻辑

支付服务实现逻辑 简单概况一下支付服务的实现逻辑 通过支付宝的沙箱环境来模拟支付功能&#xff0c;用户点击支付宝的链接后给后端发/aliPayOrder请求&#xff0c;封装支付宝需要payVo对象&#xff0c;并且调用 String pay alipayTemplate.pay(payVo)和 return pay&#xf…

A-LEVEL经济例题解析及练习Economic Question

每日一练 例题 Question: Consumer surplusA. Find Marginal Buyer’s WTP (Willingness to Pay) at Q10. B. Find Consumer Surplus for P30. Suppose P falls to $20. How much will Consumer Surplus increase due to: C. buyers entering the market D. existing buyers pa…

mysql8安装过程

1下载地址 https://downloads.mysql.com/archives/community/ 根据自己电脑系统环境选择操作系统和版本&#xff0c;本人选择下载的是windows 64位&#xff0c; 2.创建并编写my.ini文件 创建一个文本文档将文件名改为my后缀为ini my.ini配置其中basedir跟datadir自行根据加…

发布了二十年的《敏捷宣言》是否依然适用?

敏捷宣言已经诞生二十年&#xff0c;这份简短却“颠覆”规则的文件&#xff0c;帮助我们将产品开发交付的方式&#xff0c;从长途运输变成了“次日达”一样的存在。当下的我们正处在一个持续创新的世界&#xff0c;面对技术变革洪流&#xff0c;有时候我们可能会产生思考&#…