Javascript — 异步方法与异常捕获问题

news/2024/7/21 8:55:00 标签: javascript, 开发语言, harmonyos, 华为

问题:try catch为什么不能捕获未被 await 修饰的异步方法异常

async function throwError() {
    throw new Error("自定义Error!")
}

let testOne = async () => {
    console.debug("start testOne")
    try {
        throwError()
    } catch (e) {
        console.error("testOne 异常捕获")
        console.error(e)
    }
}

testOne()

let testTwo = async () => {
    console.debug("start testTwo")
    try {
        await throwError()
    } catch (e) {
        console.error("testTwo 异常捕获")
        console.error(e)
    }
}

testTwo()

执行结果:

前提一:Promise 的状态以及常用方法

Promise 是一个可以处理异步操作的对象,Promise 包含三个状态;

  • pending(待定):初始状态
  • fulfilled(已兑现):操作成功
  • rejected(已拒绝):操作失败

Promise 的常用三个方法 then() 、catch()、 finally();

其中 then() 是 Promise 被兑现和拒绝时的回调函数,包含两个函数类型参数:

  • onFulfilled:Promise 对象被兑现时异步执行的函数。它的返回值将成为 then() 返回的 Promise 对象的兑现值。如果 onFulfilled 不是一个函数,则内部会被替换为一个恒等函数((x) => x)。
  • onRejected:Promise 对象被拒绝时异步执行的函数。它的返回值将成为 catch() 返回的 Promise 对象的兑现值。如果 onRejected 不是一个函数,则内部会被替换为一个恒等函数((x) => {throw x})。

其中 catch() 是 Promise 被拒绝时的回调函数,是 .then(undefined, rejected) 的简写形式。

其中finally() 是 Promise 被兑现或者拒绝之后执行的回调函数,可以用来处理一些在 then 和 catch中执行的重复性代码。

PS:如果一个被拒绝的 Promise 没有实现拒绝事件处理器(then()、catch()、finally()),则这个事件将会由环境来进行处理,比如浏览器等。

前提二:async 关键字

async 关键字用来修饰一个异步方法,异步方法中可以使用 await 关键字

前提三:await  关键字

await 操作符用于等待一个 Promise 兑现并获取它兑现之后的值。

结论

调用异步方法在没有使用 await 修饰的情况下 Promise 的结果没有被等待且给到当前的函数,这样 try catch 也无法捕获异常了。如果 Promise 实现了拒绝事件处理器,则这个事件转交由 Promise 的拒绝事件处理器处理了,那么 try catch 依然无法捕获这个异常。


http://www.niftyadmin.cn/n/5455396.html

相关文章

【boost_search搜索引擎】1.获取数据源

boost搜索引擎 1、项目介绍2、获取数据源 1、项目介绍 boost_search项目和百度那种不一样,百度是全站搜索,而boost_search是一个站内搜索。而项目的宏观上实现思路就如同图上的思路。 2、获取数据源 我们要实现一个站内搜索,我们就要有这…

Nuxt3(路由)

说明 Nuxt的核心功能之一是文件系统路由。pages/目录中的每个Vue文件都会创建一个相应的URL(或路由),用于显示文件的内容。通过为每个页面使用动态导入,Nuxt利用代码分割来仅加载所需路由的最小量JavaScript。 简单来说&#xf…

应急 | BuleHero挖矿蠕虫最新变种分析

背 景 挖矿蠕虫病毒BuleHero擅长利用各类漏洞攻击、弱密码爆破攻击。病毒作者不断更新变种,是近期最活跃的挖矿蠕虫病毒之一。攻击者最新的BuleHero挖矿蠕虫实现入侵后,还会释放挖矿程序,使服务器的资源被消耗挖矿,极大影响正常业…

Docket常见的软件部署1

1 安装MySQL # 查看MySQL镜像 docker search mysql # 拉起镜像 docker pull mysql:5.7 # 创建MySQL数据映射卷,防止数据不丢失 mkdir -p /hmoe/tem/docker/mysql/data/ # 启动镜像 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /home…

CF1801 C. Music Festival [自定义偏序+dp+权值线段树]

传送门:CF [前题提要]:自定义偏序来优化dp的递推,感觉这个trick很好,故记录一下 考虑对于同一张专辑,显然有贡献的序列是一个递增序列,所以我们可以直接对此进行删减. 接下来我们就获得了一些专辑,并且每张专辑的价值都是递增的.我们现在需要解决的问题是如何排列我们的专辑使…

GitHub推送远程仓库详细教程

一、在远程新建一个仓库 二、在工作区初始化并提交到版本库 三、连接到远程仓库地址进行推送 四、推送到其他分支 4.1 新建其他分支 4.2 新建文件进行提交 4.3 将文件推送到其他分支 4.4 推送成功演示 4.5 连接远程跟踪分支,方便提交 4.6 直接push展示 五、其他 5…

如何备考2025年AMC8竞赛?吃透2000-2024年600道真题(免费送题

最近有家长朋友问我,现在有哪些类似于奥数的比赛可以参加?我的建议可以关注下AMC8的竞赛,类似于国内的奥数,但是其难度要比国内的奥数低一些,而且比赛门槛更低,考试也更方便。比赛的题目尤其是应用题比较有…

CF1617C Paprika and Permutation 题解 贪心

Paprika and Permutation 传送门 Paprika loves permutations. She has an array a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1​,a2​,…,an​. She wants to make the array a permutation of integers 1 1 1 to n n n. In order to achieve this goal, she can perf…