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

问题: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.hqwc.cn/news/575950.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HSF:阿里RPC框架

简介 HSF(High-speed Service Framework)是一种广泛应用于阿里巴巴内部的分布式RPC服务框架。 作为阿里巴巴的基础中间件,HSF连接了不同的业务系统,解耦了系统间的实现依赖。HSF从分布式应用的角度统一了服务的发布和调用方式&a…

智慧工地安全生产与风险预警大平台的构建,需要哪些技术?

随着科技的不断发展,智慧工地已成为现代建筑行业的重要发展趋势。智慧工地方案是一种基于先进信息技术的工程管理模式,旨在提高施工效率、降低施工成本、保障施工安全、提升施工质量。一般来说,智慧工地方案的构建,需要通过集成物…

Rust编程(五)终章:查漏补缺

闭包 & 迭代器 闭包(Closure)通常是指词法闭包,是一个持有外部环境变量的函数。外部环境是指闭包定义时所在的词法作用域。外部环境变量,在函数式编程范式中也被称为自由变量,是指并不是在闭包内定义的变量。将自…

OpenHarmony中的LLDB高性能调试器

概述 LLDB(Low Lever Debugger)是新一代高性能调试器。详细说明参考 LLDB官方文档 。 当前OpenHarmony中的LLDB工具是在 llvm15.0.4 基础上适配演进出来的工具,是HUAWEI DevEco Studio工具中默认的调试器,支持调试C和C应用。 工…

将ENVI的roi转为mask图像

方法1: 直接使用ENVI step1: 将roi文件存储为.roi格式 [1] 链接: link step2: 将.roi转为mask [2] 链接: link [3] 链接: link 方法2: 使用Matlab step1: 将roi文件存储为.xlm 文件 step2:针对把每个roi存储为一个单独文件 [4] 读取xlm文…

【React】onClick点击事件传参的4种方式

记录React onClick 点击事件传参的 4 种方式 方式一&#xff1a;使用内联箭头函数 import React, { MouseEvent } from "react";function App() {const handleClick (event: MouseEvent<HTMLButtonElement>, name: string) > {console.log(event)console.…

HWOD:字符的排序

一、知识点 char的最大值是127&#xff0c;最小值是-128 自己填充的char型数组&#xff0c;以字符串打印&#xff0c;打印之前要手动在末尾加上 \0 二、题目 1、描述 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#x…

【机器学习300问】55、介绍推荐系统中的矩阵分解算法是什么、有什么用、怎么用?

本来这篇文章我想先讲矩阵分解算法是什么东西的&#xff0c;但这样会陷入枯燥的定义中去&#xff0c;让原本非常有趣技术在业务场景中直观的使用路径被切断。所以我觉得先通过一个具体的推荐算法的例子&#xff0c;来为大家感性的介绍矩阵分解有什么用会更加合理。 如果你还不知…

Xcode删除原本的Git,再添加新的git

本文参考&#xff1a;Xcode怎么删除原本git,在重新设置新的git地址_ios xcode 删除原本git-CSDN博客 开发中会有一个问题。Xcode项目A 提交到Git服务器server1&#xff0c;此时项目A内部已经存在一个Git文件&#xff0c;与server1相关联。 此时你想将项目A提交到 另一个Git…

快速上手Spring Cloud 七:事件驱动架构与Spring Cloud

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

智能设备配网保姆级教程

设备配网 简单来说&#xff0c;配网就是将物联网&#xff08;IoT&#xff09;设备连接并注册到云端&#xff0c;使其拥有与云端远程通信的能力。配网后&#xff0c;智能设备才能被手机应用或者项目管理后台控制&#xff0c;依托于智能场景创造价值。本文介绍了配网的相关知识&…

C++优先队列——priority_queue,函数对象,labmda表达式,pair等

头文件&#xff1a;#include<queue> 内部使用堆来实现&#xff0c;在需要或得最大的几个值或最小的几个值而不关心整个数组的顺序时非常好用。 用法&#xff1a; priority_queue<int, vector<int>, greater<int>>q; 第一个参数为堆中存储的元素。 …