当前位置: 首页 > news >正文

try...catch 和then...catch的异同点分析

try…catch 和 then…catch 的异同点分析

在现代 JavaScript 编程中,异常处理和 Promise 的处理是非常常见的两种方式。try...catch 语句主要用于同步代码的异常处理,而 .then().catch() 是 Promise 中的异步处理方法。

1. 基础概念

1.1 try…catch

try...catch 是一种用于捕获同步代码中抛出的异常的结构。它可以捕捉在 try 块中抛出的异常,并在 catch 块中处理这些异常。其基本语法如下:

try {// 可能抛出错误的代码
} catch (error) {// 处理错误
}

1.2 then…catch

.then().catch() 是 Promise 对象中的方法,用于处理异步操作的结果和错误。如果 Promise 被解决,则执行 then() 方法;如果 Promise 被拒绝,则执行 catch() 方法。其基本语法如下:

asyncFunction().then(result => {// 处理成功结果}).catch(error => {// 处理错误});

2. 使用场景

2.1 try…catch 使用场景

  • 同步代码: 适用于同步函数内部的错误处理。
  • 异步代码: 在异步代码中,也可以用 async/await 搭配 try...catch 来捕获异步调用中的错误。

2.2 then…catch 使用场景

  • 异步操作: 适用于 Promise 对象,无论是 AJAX 请求、读取文件还是其他异步操作。
  • 链式调用: 允许继续连接多个操作,形成更有条理的代码结构。

3. 代码示例

3.1 try…catch 示例

try {let result = synchronousFunction();
} catch (error) {console.error("Error occurred:", error);
}

3.2 then…catch 示例

asynchronousFunction().then(result => {console.log(result);}).catch(error => {console.error("Error occurred:", error);});

3.3 使用 async/await + try…catch 示例

async function asyncFunction() {try {let result = await someAsyncCall();console.log(result);} catch (error) {console.error("Error occurred:", error);}
}

4. 异同点总结

属性try…catchthen…catch
类型同步错误处理异步错误处理
用法捕获同步错误捕获异步操作的错误
语法使用 trycatch 关键字使用 Promise 的 thencatch
功能直接捕获抛出的异常处理链式调用中的错误
场景适用于同步代码和 async/await 代码适用于 Promise 和 async 函数
控制流简单,线性的错误捕捉可以继续链接其他的 then 处理
清晰性对简单的错误处理清晰易读更适合异步编程
- 支持链式调用,容易管理多重异步操作
优点简单易用,适合同步执行
清晰的错误处理逻辑
在处理多个异步操作时更加直观
缺点不适合异步场景
性能可能降低,频繁抛出错误时
只能捕获 Promise 所在的上下文
- 处理逻辑相对复杂

5. 综合对比

5.1 错误处理的直观性

  • try...catch 结构简单直观,对于需要捕获多个地方可能抛出错误的代码段尤其有效。
  • then...catch 的链式结构在处理多个异步操作时更加清晰,有助于避免“回调地狱”。

5.2 性能考虑

从性能角度来看,try...catch 的成本较高(尤其是在异常频繁发生的情况下),因此,尽量避免使用 try...catch 来处理控制流。而 Promise 一般采用更优雅的错误传递机制。

5.3 性能比较

性能try…catchthen…catch
性能在异常发生频繁时成本高一般性能较优,尤其在链式调用中

6. 推荐情况

6.1 使用 try...catch

  • 在处理同步代码时,如果代码块中可能会抛出异常,使用 try...catch 是最安全的选择。
  • 在使用 async/await 时,强烈建议使用 try...catch 来处理异步函数中的错误。

6.2 使用 then...catch

  • 当使用 Promise 进行错误处理时,优先使用 then...catch,关注逻辑的清晰性。
  • 在需要链式操作的时候,不妨采用 then...catch

关注微信公众号温暖前端,不定期分享前端知识点和前端资料↓↓↓

相关文章:

try...catch 和then...catch的异同点分析

try…catch 和 then…catch 的异同点分析 在现代 JavaScript 编程中,异常处理和 Promise 的处理是非常常见的两种方式。try...catch 语句主要用于同步代码的异常处理,而 .then().catch() 是 Promise 中的异步处理方法。 1. 基础概念 1.1 try…catch …...

Mit6.S081-实验环境搭建

Mit6.S081-实验环境搭建 注:大家每次做一些操作的时候觉得不太保险就先把虚拟机克隆一份 前言 qemu(quick emulator):这是一个模拟硬件环境的软件,利用它可以运行我们编译好的操作系统。 准备一个Linux系统&#xf…...

以太网交换安全:MAC地址漂移

一、什么是MAC地址漂移? MAC地址漂移是指设备上一个VLAN内有两个端口学习到同一个MAC地址,后学习到的MAC地址表项覆盖原MAC地址表项的现象。 MAC地址漂移的定义与现象 基本定义:MAC地址漂移发生在一个VLAN内的两个不同端口学习到相同的MAC地…...

STM32实现串口接收不定长数据

原理 STM32实现串口接收不定长数据,主要靠的就是串口空闲(idle)中断,此中断的触发条件与接收的字节数无关,只有当Rx引脚无后续数据进入时(串口空闲时),认为这时候代表一个数据包接收完成了&…...

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性(ACID) 1. 原子性(atomicity): 2. 一致性(consistency): 3. 隔离性(isolation): 4. 持久性(durability): 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …...

外接数据库给streamlit等web APP带来的变化

之前我采用sreamlit制作了一个调查问卷的APP, 又使用MongoDB作为外部数据存储,隐约觉得外部数据库对于web APP具有多方面的意义,代表了web APP发展的趋势之一,似乎是作为对这种趋势的响应,streamlit官方近期开发了st.c…...

Gitpod: 我们正在离开 Kubernetes

原文:Christian Weichel - 2024.10.31 Kubernetes 似乎是构建远程、标准化和自动化开发环境的显而易见选择。我们也曾这样认为,并且花费了六年时间,致力于打造最受欢迎的云开发环境平台,并达到了互联网级的规模。我们的用户数量达…...

1.每日SQL----2024/11/7

题目: 计算用户次日留存率,即用户第二天继续登录的概率 表: iddevice_iddate121382024-05-03232142024-05-09332142024-06-15465432024-08-13523152024-08-13623152024-08-14723152024-08-15832142024-05-09932142024-08-151065432024-08-131123152024-…...

普通一本大二学生,软件工程,想考研985,想知道哪个大学的软件工程好,又不至于完全考不起的?

竞争难度适中:相较于顶尖985院校,重庆大学作为实力派985高校,其竞争烈度较为温和,考研难度适中偏易,为追求高性价比深造路径的考生提供了理想之选。 考试难度友好:重庆地区考研评分标准相对宽松&#xff0…...

「QT」几何数据类 之 QMatrix4x4 4x4矩阵类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

让Apache正确处理不同编码的文件避免中文乱码

安装了apache2.4.39以后&#xff0c;默认编码是UTF-8&#xff0c;不管你文件是什么编码&#xff0c;统统按这个来解析&#xff0c;因此 GB2312编码文件内的中文将显示为乱码。 <!doctype html> <html> <head><meta http-equiv"Content-Type" c…...

人员密集场所遇到突发火灾事故该如何应对

0引言 在繁华喧嚣的都市中&#xff0c;人员密集场所如购物中心、电影院、办公楼等&#xff0c;是人们日常生活不可或缺的一部分。然而&#xff0c;在这些看似繁华的背后&#xff0c;隐藏着不可忽视的安全隐患——火灾。火灾无情&#xff0c;往往在不经意间爆发&#xff0c;瞬间…...

使用QtWebEngine的Mac应用如何发布App Store

前言 因为QtWebEngine时第三方包,苹果并不直接支持进行App Store上签名和发布,所以构建和发布一个基于使用QtWebEngine的应用程序并不容易,这里我们对Qt 5.8稍微做一些修改,以便让我们的基于QtWeb引擎的应用程序并让签名能够得到苹果的许可。 QtWebEngine提供了C++和Qml的…...

微机原理与接口技术——中断系统与可编中断控制芯片8259A

目录 一、8259A 芯片介绍 二、8259A 的内部结构和引脚 三、8259A 的中断工作过程 四、8259A 的工作方式 五、8259A 的编程 六、外部中断服务程序 一、8259A 芯片介绍 Intel 8259A 是可编程中断控制器&#xff0c;可用于管理 Intel 8080/8085、8086/8088、80286/80386 的…...

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期

目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …...

面试题分享11月7日

1、ThreadLocal 是什么 是 Java 中线程的本地方法变量&#xff0c;用来存储每个线程的私有数据&#xff0c;每个线程都有它的独立副本&#xff0c;相互隔离&#xff0c;互不影响 2、ThreadLocal 实现原理 每个 ThreadLocal 都有一个 ThreadLocalMap 对象&#xff0c;用来存储…...

数据结构_哈夫曼树及其应用

构造算法的例子 构造算法的实现 初始化&#xff0c;置权值 int i, m, s1, s2;m 2 * n - 1;for (i 1; i < m; i){HT[i].lch 0;HT[i].rch 0;HT[i].parent 0;}for (i 1; i < n; i){cin >> HT[i].weight;}合并结点 // 创建哈夫曼树for (i n 1; i < m; i){s1…...

从0开始学习机器学习--Day19--学习曲线

一般来说&#xff0c;如果一个算法的表现不理想&#xff0c;那么多半是因为出现了欠拟合或过拟合问题&#xff0c;这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题&#xff0c;亦或是二者皆有&#xff0c;这有助于我们精准定位问题所在。 之前&#xff0c;我们发现…...

2.索引:深入解析 B+ 树:原理、MySQL 应用及与其他数据结构的对比

B 树是一种高效的平衡树结构&#xff0c;在数据库和文件系统中被广泛应用&#xff0c;尤其在 MySQL 中&#xff0c;InnoDB 存储引擎通过 B 树实现索引结构&#xff0c;提升了大数据量条件下的查询性能。 本文将深入介绍 B 树的原理和设计特点&#xff0c;分析 MySQL 中使用 B …...

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现

目录 1->栈的概念和结构 1.1栈的概念 1.2栈的结构 2->栈的实现 2.1定义关于栈的结构体和各种函数 2.2栈的初始化 STInit 函数 2.3栈的销毁 STDestroy 函数 2.4栈的插入操作 STPush 函数 2.5栈的判断是否为空操作 STEmpty 函数 2.6栈的删除操作 STPop 函数 2.7…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...