await func().catch()和try{ func() }.catch(),两种写法,有什么区别

embedded/2025/3/22 9:55:16/

await func().catch() 和 try { await func() } catch {} 是两种处理异步操作错误的常见写法,虽然它们的功能相似,但在使用场景和细节上有一些区别。

1. await func().catch()

这种写法是将 catch 直接链式调用到 func() 上,捕获 func() 返回的 Promise 的错误。

javascript">await func().catch(error => {console.error('Error:', error);
});

特点:

  • 简洁:代码更简洁,适合简单的错误处理。
  • 作用范围:只捕获 func() 的 Promise 错误,不会捕获 catch 回调中的错误。
  • 返回值:如果 func() 成功,返回 func() 的结果;如果失败,返回 catch 回调的返回值(如果没有返回值,则是 undefined)。

适用场景:

  • 当你只需要简单地处理错误,并且不需要在 catch 中执行复杂逻辑时。
  • 当你希望将错误处理和业务逻辑分开时。

2. try { await func() } catch {}

这种写法是传统的 try-catch 语法,用于捕获 await func() 中的错误。

javascript">try {const result = await func();console.log('Success:', result);
} catch (error) {console.error('Error:', error);
}

特点:

  • 明确:错误处理逻辑更清晰,适合复杂的错误处理。
  • 作用范围:可以捕获 try 块中所有同步和异步的错误(包括 await func()try 块中的其他代码)。
  • 返回值:如果 func() 成功,返回 func() 的结果;如果失败,进入 catch 块。

适用场景:

  • 当你需要在错误处理中执行复杂逻辑时。
  • 当你需要捕获 try 块中所有可能的错误时。

3. 两种写法的区别

特性await func().catch()try { await func() } catch {}
代码简洁性更简洁稍显冗长
错误捕获范围

只捕获 func() 的 Promise 错误

捕获 try 块中所有同步和异步错误
返回值处理返回 func() 或 catch 回调的结果返回 func() 或进入 catch 块
适用场景简单错误处理复杂错误处理
可读性适合链式调用,但错误处理逻辑可能不够直观错误处理逻辑更清晰

4. 示例对比

(1)await func().catch()

javascript">const result = await func().catch(error => {console.error('Error:', error);return 'default value'; // 返回一个默认值
});
console.log('Result:', result); // 如果 func() 失败,输出 'default value'

(2)try { await func() } catch {}

javascript">let result;
try {result = await func();console.log('Success:', result);
} catch (error) {console.error('Error:', error);result = 'default value'; // 返回一个默认值
}
console.log('Result:', result); // 如果 func() 失败,输出 'default value'

5. 如何选择?

  • 如果你只需要简单地处理错误,并且希望代码更简洁,可以使用 await func().catch()
  • 如果你需要处理复杂的错误逻辑,或者需要捕获 try 块中的所有错误,建议使用 try { await func() } catch {}

6. 总结

  • await func().catch():简洁,适合简单错误处理,只捕获 func() 的错误。
  • try { await func() } catch {}:功能更强大,适合复杂错误处理,捕获 try 块中所有错误。

参考:https://juejin.cn/post/7483870074287439911


http://www.ppmy.cn/embedded/174656.html

相关文章

Linux驱动开发实战(八):Pinctrl驱动中pins和npins的传递流程以及引脚状态记录详解

Linux驱动开发实战(八):Pinctrl驱动中pins和npins的传递流程以及引脚状态记录详解 文章目录 Linux驱动开发实战(八):Pinctrl驱动中pins和npins的传递流程以及引脚状态记录详解前言一、数据传递流程详解1.1 …

【读点论文】Chain Replication for Supporting High Throughput and Availability

在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无…

微服务分层架构详解:表示层、应用层与基础设施层的协同工作

微服务分层架构详解:表示层、应用层与基础设施层的协同工作 文章目录 微服务分层架构详解:表示层、应用层与基础设施层的协同工作1. 表示层(Presentation Layer)1.1 表示层的作用1.2 技术选型1.3 表示层的挑战 2. 应用层&#xff…

【从零开始学习计算机科学与技术】系统工程概论(四)系统仿真 与 系统评估

【从零开始学习计算机科学与技术】系统工程概论(四)系统仿真 与 系统评估 系统仿真系统仿真的工作流程应用系统动态学模型的步骤系统与反馈反馈系统反馈回路SD结构模型化的表示因果关系图流图流图的符号流图-流图绘制程序和方法基本反馈回路的DYNAMO仿真分析基本DYNAMO方程系…

深入理解MySQL日志机制

目录 1. MySQL日志概述 2. 错误日志(Error Log) 2.1 错误日志的作用 2.2 错误日志的配置 2.3 查看错误日志 3. 二进制日志(Binary Log) 3.1 二进制日志的作用 3.2 二进制日志的配置 3.3 查看二进制日志 3.4 二进制日志的…

Flume实战:Kafka Channel的使用配置场景

概述 使用Flume采集数据时,我们可能会遇到各种场景,一个数据采集任务的标准配置都是Source->Channel->Sink。对于Channel组件的选择常用的有Memory Channel、File Channel。而我们都知道,Kafka组件在大数据平台的使用过程中是一个非常…

【JavaEE进阶】Linux常用命令

目录 🍃前言 🌴pwd 与 ls 🚩pwd 🚩ls 🎍cd 🌲mkdir与touch 🚩mkdir 🚩touch 🍀cat与rm 🚩cat 🚩rm 🎋vim 🚩…

C++ 各种map对比

文章目录 特点比较1. std::map2. std::unordered_map3. std::multimap4. std::unordered_multimap5. hash_map(SGI STL 扩展) C 示例代码代码解释 特点比较 1. std::map 底层实现:基于红黑树(一种自平衡的二叉搜索树&#xff09…