如何给所有的 await async 函数添加try/catch?

简介: 如何给所有的 await async 函数添加try/catch?

如何给所有的 await async 函数添加try/catch?做全局捕获异常。

面试官:如何给所有的 await async 函数添加try/catch?做全局捕获异常。
我们可以使用 window.addEventListener('unhandledrejection', function (event) {})
读音:  unhandled  【an han dou】    rejection   【rɪ 'dʒe k ʃ(ə)n】
event有个reason属性,里面有error的message和堆栈信息…
要event.preventDefault()阻止冒泡才行
mdn 对于 unhandledrejection 的解释
当 Promise 被 reject 且没有 reject 处理器的时候,会触发 unhandledrejection 事件;
这可能发生在 window 下,但也可能发生在 Worker 中。
这对于调试和为意外情况提供后备错误处理非常有用。

我们来看一下下面这一段代码

async function fn() {
  let value = await new Promise((resolve, reject) => {
    reject('我报错啦');
  }) 
  console.log('do something...');
}
fn()

出现的现象

好家伙直接在控制台报错了。后面又没有捕获异常。
那怎么去解决这个问题呢?
可以使用catch捕获异常

使用catch处理异常

async function fn() {
    let value = await new Promise((resolve, reject) => {
        reject('我报错啦');
    }).catch(err=>{
        console.log('捕获到了异常:',err)
    })
    console.log('do something...');
}
fn()

喊上层自己处理(手动狗头)

async function fn() {
    let value = await new Promise((resolve, reject) => {
        reject('我报错啦');
    })
    console.log('do something...');
}
fn().then(res=>{
    console.log('res',res)
}).catch(err=>{
    console.log('上层使用者捕获:',err)
})

捕获 window.addEventListener 捕获异常

window.addEventListener("unhandledrejection", function (event) {
    console.log('全局捕获', event )
    event.preventDefault()
})
async function fn() {
    let value = await new Promise((resolve, reject) => {
        reject('failure');
    })
    console.log('do something...');
}
fn()

用最简单的语言总结一下

unhandledrejection 事件监听 reject异常。
或者说 unhandledrejection 最全局异常捕获
再者说 unhandledrejection给所有的 await async 函数添加try/catch

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
JavaScript API
Vue3新的状态管理库-Pinia(保姆级别教程)
Vue3新的状态管理库-Pinia(保姆级别教程)
1045 0
|
数据采集 人工智能 编解码
AI训练师速成攻略(二):数据收集与清洗
在AI训练中,数据如同未经提炼的矿石,需精心筛选方能化为“黄金”。本文将带你从零开始,探索数据挖掘与处理的艺术:如何定位富饶的“矿脉”,选取合适的工具,规避常见陷阱,并通过实战演练掌握数据清洗技巧。此外,还展望了未来数据工作的趋势,如自动化革命和新兴数据源。让我们手持数字筛子,在混沌中寻找真金,在平凡的数据清洗中铸就非凡的AI智慧。
806 1
|
网络协议
计算机网络中常用的网络协议
以上是一些常见的网络协议及其分类,不同的网络协议在计算机网络中扮演着不同的角色,共同构成了网络通信的基础
1367 1
|
传感器 消息中间件 物联网
常用的物联网协议
常用的物联网协议包括:MQTT(消息队列遥测传输)、CoAP(受限应用协议)、HTTP/HTTPS、LWM2M(轻量级机器对机器)和Zigbee等。这些协议在不同的应用场景中发挥着重要作用,如数据传输、设备管理等。
2134 2
|
算法 Java Android开发
Android查看获取MD5和SHA1值(应用签名)
方法一:C:\Users\Administrator>"C:\Program Files\Java\jre1.8.0_131\bin\keytool.exe" -list -v -keystore "E:\WebView\ceshi.jks"
3366 0
|
PyTorch 算法框架/工具
PyTorch 报错:TypeError: exceptions must derive from BaseException
PyTorch 报错:TypeError: exceptions must derive from BaseException
903 0
|
机器学习/深度学习 人工智能 编解码
深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
【9月更文挑战第2天】深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
 深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
|
Python
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
1032 160
|
JSON 数据格式