async/await 到底要不要加 try catch?我来给你整明白!

news/2026/1/24 10:45:14/文章来源:https://www.cnblogs.com/smileZAZ/p/19525458

🧑‍💻 写在开头

点赞 + 收藏 === 学会🤣🤣🤣

前言

现在写异步代码,基本上就是 Promiseasync/await 两种写法。虽然这俩都能干同样的活,但 async/await 写起来更像同步代码,读起来更顺眼,所以很多人都说它是"异步编程的终极方案"。

不过有个问题挺让人纠结的:用 async/await 的时候,到底要不要加 try catch 来抓错误?我看了好多项目代码,发现大家做法都不一样,有的加有的不加,甚至有的连 catch 都不写,这就很迷了。

先看几种写法

写法1:老实用 try catch

function getUserInfo () {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求出错了哦')}, 1000)})
}async function logined () {try {let userInfo = await getUserInfo()// 如果上面出错了,这里就不会执行了let pageInfo = await getPageInfo(userInfo?.userId)} catch(e) {console.warn('抓到一个错误:', e)}
}logined()

这种写法的好处是错误能抓住,而且代码会在出错的地方停下来,不会继续往下执行。缺点就是 try catch 占了太多行数,每个接口都这么写的话,代码看起来有点啰嗦。

写法2:直接在后面接 .catch()

function getUserInfo () {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求出错了哦')}, 1000)})
}async function logined () {let userInfo = await getUserInfo().catch(e => console.warn('抓到一个错误:', e))// 注意:这里即使出错了也会继续执行!if (!userInfo) return // 所以得手动检查一下let pageInfo = await getPageInfo(userInfo?.userId)
}logined()

这种写法也能抓住错误,但是程序不会自动停下来,还会继续往下走。所以你得自己检查 userInfo 是不是空的,不然可能会出问题。

写法3:在 catch 里再 reject

function getUserInfo () {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求出错了哦')}, 1000)})
}async function logined () {let userInfo = await getUserInfo().catch(e => {console.warn('抓到一个错误:', e)return Promise.reject(e) // 这里再扔出去一次})// 这样就会停在这里了let pageInfo = await getPageInfo(userInfo?.userId)
}logined()

这种写法能让程序在出错的地方停下来,但是会在控制台留下一个 "uncaught (in promise)" 的错误提示,有些人觉得这样不太好看。

到底该用哪种?

其实在真实项目里,我们一般会用 axios 或 fetch 这些库来发请求,通常会对它们进行一层封装。在封装的时候就可以统一处理错误了。

至于要不要在 await 后面加 try catch,主要看你想不想让程序在出错的时候停下来:

  • 不想中断程序,可以这样写:

let userInfo = await getUserInfo().catch(e => console.warn(e))
if (!userInfo) return // 记得检查一下是不是空的

这样控制台不会报红字错误。

  • 想中断程序,又不想看控制台报错,就用 try catch:
try {let userInfo = await getUserInfo()let pageInfo = await getPageInfo(userInfo?.userId)
} catch(e) {console.warn(e)
}
  • 想中断程序,又不介意控制台报错:
let userInfo = await getUserInfo().catch(e => {console.warn(e)return Promise.reject(e)
})
// 这里会停下来
let pageInfo = await getPageInfo(userInfo?.userId)

我的建议

从我个人的使用体验来看,try catch 是最好的选择

  • 代码逻辑更清晰,更像同步代码的写法
  • 错误处理集中在一个地方,好管理
  • 控制台不会出现一堆难看的 "uncaught (in promise)" 错误
  • 符合直觉:出错了就应该停下来

虽然 try catch 会让代码多几行,但是比起代码的可读性和可维护性,这点代价是值得的。

既然都已经用 async/await 来写同步风格的代码了,那就干脆用到底,用 try catch 来处理错误,这样代码风格更统一,读起来也更舒服。

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1209351.shtml

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

相关文章

淘股吧24小时个股搜索热度分析报告 - 2026-01-24 10:38:24

淘股吧24小时个股搜索热度分析 分析时间: 2026-01-24 10:38:24 ==================================================元素位置信息: ================================================== 行3: 股票名称 - 中国长城, …

CHIPSTAR智浦欣 CS8122S CS8138S SOP-8 线性稳压器

特性 5伏士2%稳压输出 低压差电压(0.6V0.5A) 750毫安输出电流能力 外部编程复位延迟 故障保护反向电池保护60伏负载放电-50伏反向瞬态 短路保护热关断

如何用YOLOv9搭建实时检测系统?答案在这里

如何用YOLOv9搭建实时检测系统?答案在这里 YOLO系列模型自问世以来,就以“快、准、稳”成为工业界目标检测的首选。当YOLOv8还在广泛部署时,YOLOv9已悄然登场——它不是简单迭代,而是引入了可编程梯度信息(PGI&#xf…

Llama3-8B指令微调教程:Alpaca格式一键启动,快速定制任务

Llama3-8B指令微调教程:Alpaca格式一键启动,快速定制任务 1. 为什么选Llama3-8B做指令微调? 你是不是也遇到过这些情况:想让大模型听懂你的业务指令,但发现开源模型默认只“会聊天”,不会执行你写的流程&…

从零开始部署BERT语义系统:WebUI集成与API调用完整指南

从零开始部署BERT语义系统:WebUI集成与API调用完整指南 1. 这不是普通填空,是真正懂中文的语义推理 你有没有试过在写文案时卡在一个词上?比如“这个方案很有____性”,后面该接“创新”还是“前瞻”?又或者读到一句古…

Qwen-1.5B原版 vs 蒸馏版:DeepSeek-R1在数学任务上的精度对比

Qwen-1.5B原版 vs 蒸馏版:DeepSeek-R1在数学任务上的精度对比 你有没有试过让一个15亿参数的模型解一道高中数学压轴题?不是简单套公式,而是像人一样一步步推导、验证、回溯——甚至自己发现中间步骤的逻辑漏洞?最近我们实测了一…

YOLOv9训练监控怎么做?TensorBoard集成部署案例

YOLOv9训练监控怎么做?TensorBoard集成部署案例 训练深度学习模型就像开车——光有油门和方向盘不够,你还得盯着仪表盘。YOLOv9作为当前目标检测领域备受关注的新一代模型,其训练过程复杂、参数多、迭代长,没有实时可视化监控&am…

Docker 容器中修改 root 密码的正确方法

在使用 Docker 容器时,有时我们需要在容器创建后动态修改其中用户的密码,尤其是 root 用户的密码。很多人尝试使用 docker exec 命令直接执行 chpasswd,但常常因为命令格式或 shell 解析问题导致密码未成功更新。本文将详细介绍如何正确使用 …

Cute_Animal_For_Kids_Qwen_Image容灾备份:生产环境部署注意事项

Cute_Animal_For_Kids_Qwen_Image容灾备份:生产环境部署注意事项 1. 这不是普通图片生成器,而是专为孩子设计的“可爱动物画师” 你有没有试过给孩子讲一个关于小熊猫骑自行车的故事,却找不到一张既安全又可爱的配图?或者想为幼…

光谷AI产业发展峰会倒计时2天:华科武汉校友会加持 总报名数超500人

雷递网 乐天 1月23日雷递网主办的《2026光谷AI产业发展峰会》将于2026年1月25日下午2点在武汉光谷皇冠假日酒店,现在是倒计时2天。本次《2026光谷AI产业发展峰会》的活动主旨是诚邀对武汉感兴趣的企业家、创业者、投资人到武汉交流与发展,探索与发现投资…

NHSE开源工具功能探索与实践指南

NHSE开源工具功能探索与实践指南 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 在游戏存档修改领域,玩家常面临两大核心挑战:一方面,游戏内资源收集的时间成本…

结合工程与科学:揭秘某中心Alexa核心技术演进

结合工程与科学:揭秘某中心Alexa核心技术演进 对许多人来说,使用语音与计算机、手机和其他设备交互,是由如某中心的Alexa等服务实现的、相对较新的体验。但对Luu Tran来说,这已是“老生常谈”。作为一位资深首席工程师&#xff0…

告别复杂配置!用科哥开发的GPEN镜像快速修复模糊人像

告别复杂配置!用科哥开发的GPEN镜像快速修复模糊人像 你是否也遇到过这些情况:翻出老照片想发朋友圈,却发现人脸糊得看不清五官;客户发来一张低分辨率证件照,却要求立刻出高清海报;修图软件调了半小时&…

IDC 学习笔记

IDC机房管理是一个涉及基础设施、IT技术和标准流程的综合性领域。 知识体系 基础设施层 核心系统:供配电系统 (含UPS)、暖通空调系统 (精密空调)、消防系统、安防与环境监控系统 (门禁、视频、温湿度、漏水)。 学习要点:原理、日常巡检、预防性维护、故障应急处理、容量规划…

Qwen为何能替代多模型?指令遵循能力深度剖析

Qwen为何能替代多模型?指令遵循能力深度剖析 1. 单模型的“分身术”:Qwen如何用一套参数干两份活 你有没有遇到过这样的场景:想做个简单的情感分析,结果得先装BERT,再配一个对话模型,最后发现显存不够、环…

基于阶梯式碳交易机制的电制氢综合能源系统热电优化matlab仿真

1.课题概述 基于阶梯式碳交易机制的电制氢综合能源系统热电优化matlab仿真。全球气候变暖,我国提出 “双碳” 目标,电力行业碳减排对实现目标意义重大。综合能源系统(IES)可优化多能系统低碳经济性,但多数文献在研…

2026年1月成都共享自助洗车_智能自助洗车机加盟商TOP3综合指南

2026年1月成都共享自助洗车_智能自助洗车机加盟商TOP3综合指南随着国内汽车保有量突破3.5亿辆,传统洗车行业受租金高、人工成本上涨等痛点制约,共享自助洗车模式凭借24小时运营、低成本、高毛利的优势,成为汽车后市…

机器人领域 2015→2025 的总纲级十年演进

给出一份**“机器人领域 2015→2025 的总纲级十年演进”:用一张主线地图**把所有分支串起来,告诉你“十年真正变的是什么、分水岭在哪里、为什么今天大家都在谈平台化与闭环治理”。0) 一句话总纲2015:拼算法让机器人能跑;2020&am…

VMware ESXi 9.0.2.0 macOS Unlocker OEM BIOS 2.7 H3C 新华三 定制版

VMware ESXi 9.0.2.0 macOS Unlocker & OEM BIOS 2.7 H3C 新华三 定制版VMware ESXi 9.0.2.0 macOS Unlocker & OEM BIOS 2.7 H3C 新华三 定制版 VMware ESXi 9.0.2.0 macOS Unlocker & OEM BIOS 2.7 标准…

VMware ESXi 9.0.2.0 macOS Unlocker OEM BIOS 2.7 Dell 戴尔 定制版

VMware ESXi 9.0.2.0 macOS Unlocker & OEM BIOS 2.7 Dell 戴尔 定制版VMware ESXi 9.0.2.0 macOS Unlocker & OEM BIOS 2.7 Dell 戴尔 定制版 VMware ESXi 9.0.2.0 macOS Unlocker & OEM BIOS 2.7 标准版…