为了学会更多炫酷的 canvas 效果,我熬夜复习了三角函数相关的知识点
admin
2024-03-29 01:00:01
0

稳定性建设之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的相关知识,提升工作效率。



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

相关内容

热门资讯

原创 真... 乔布斯曾讲过一个企业的底层逻辑:如果你在顶层做了正确的事,底层的结果就会随之而来。 人们关注企业每年...
国内成品油价今晚上涨,加满一箱... 界面新闻记者 | 田鹤琪 国内成品油价迎来“三连涨”。 2月24日,国家发改委发布消息称,自24时...
马斯克设想从月球电磁弹射AI卫... IT之家 2 月 25 日消息,据新华社报道,为更便捷部署专用于人工智能 (AI) 的数据中心卫星网...
马年首涨:中概股破局,A股引领... 在黄金因美元强势而黯然跳水、A股于春节后首个交易日释放出久违的磅礴巨量之际,大洋彼岸的美股市场,第一...
原创 帮... 昨晚大宗商品市场,走出一场“分道扬镳”的戏码。 原油连续第三天下跌,WTI跌破66美元,布伦特收在7...
今起可预约!办理2025年度个... 今起可预约!办理2025年度个税汇算 这些事项要注意 2026-02-25 06:54:50 看看...
原创 天... 年后的天津二手房,马上就要起跑了。 其实在1月份迹象就已显现。 往年的楼市淡季却“反常”得活跃:连续...
13F机构追踪:谷歌、拼多多、... 来源:活报告 在美股市场,资产管理规模超过1亿美元的机构需要在每个季度结束后的45天内向SEC提交1...
原创 手... 最近一段时间,有个词突然走红甚至冲上热搜,这就是手搓经济,在这个早已经现代工业化的时代,手搓经济是怎...
【美联储理事警告:美联储货币政... 【美联储理事警告:美联储货币政策可能无法应对AI引发的失业潮 】库克称,AI已引发美国劳动力市场的代...
黄金和交易提醒:金价高位“吞没... 来源:市场资讯 文章来源:汇通财经 周三(2月26日)亚市早盘,现货黄金窄幅震荡,目前交投于5150...
IPO雷达| 百普赛斯港股IP... 百普赛斯(301080.SZ)正式向香港联交所递交招股书。根据公司同步发布的2025年度业绩预告,全...
原创 澳... 2025年一则“澳洲高薪挖角中国稀土团队”的新闻,把全球稀土市场搅得风生水起。澳大利亚莱纳斯公司甩出...
苹果收购单人AI初创公司inv... IT之家 2 月 25 日消息,据 MacRumors 报道,一份提交给欧盟的新文件显示,苹果公司已...
珍惜:由早晨跑步所想到的 我每天早晨起来习惯在校园跑步,在跑步的时候,常常会思考跑步、人生及享受人生之间的关系。 我们知道人的...
趁乱抛售?最高法院刚裁决,对冲... 来源:市场资讯 来源:金十数据 根据外媒获得的一份美国银行报告,花旗的对冲基金客户在上周五美国最高法...
特别关注|9艘!“超高规格”新... 根据广船国际官微介绍,上述MR型油轮新造船为广船国际自主设计,总长约183米、宽32.2米,设计服务...
甲骨文股价在星门项目相关报道发... 来源:环球市场播报 周一, 甲骨文股价下跌4.5%,此前报道称,这家云计算公司与OpenAI和软银的...