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

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

🧑‍💻 写在开头

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

前言

现在写异步代码,基本上就是 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.jsqmd.com/news/293117/

相关文章:

  • 淘股吧24小时个股搜索热度分析报告 - 2026-01-24 10:38:24
  • CHIPSTAR智浦欣 CS8122S CS8138S SOP-8 线性稳压器
  • 如何用YOLOv9搭建实时检测系统?答案在这里
  • Llama3-8B指令微调教程:Alpaca格式一键启动,快速定制任务
  • 从零开始部署BERT语义系统:WebUI集成与API调用完整指南
  • Qwen-1.5B原版 vs 蒸馏版:DeepSeek-R1在数学任务上的精度对比
  • YOLOv9训练监控怎么做?TensorBoard集成部署案例
  • Docker 容器中修改 root 密码的正确方法
  • Cute_Animal_For_Kids_Qwen_Image容灾备份:生产环境部署注意事项
  • 光谷AI产业发展峰会倒计时2天:华科武汉校友会加持 总报名数超500人
  • NHSE开源工具功能探索与实践指南
  • 结合工程与科学:揭秘某中心Alexa核心技术演进
  • 告别复杂配置!用科哥开发的GPEN镜像快速修复模糊人像
  • IDC 学习笔记
  • Qwen为何能替代多模型?指令遵循能力深度剖析
  • 基于阶梯式碳交易机制的电制氢综合能源系统热电优化matlab仿真
  • 2026年1月成都共享自助洗车_智能自助洗车机加盟商TOP3综合指南
  • 机器人领域 2015→2025 的总纲级十年演进
  • 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 Dell 戴尔 定制版
  • 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真
  • 基于 Vue3 + TypeScript + Element Plus 建立 DeepSeek AI 对话界面(流式输出)
  • VMware ESXi 9.0.2.0 macOS Unlocker OEM BIOS 2.7 Realtek 网卡驱动定制版
  • Z-Image-Turbo日志查看技巧,快速定位运行问题
  • MinerU电商应用场景:商品说明书结构化提取案例
  • 基于MATLAB的三维装箱程序实现(遗传算法+模拟退火优化)
  • 在 IDEA 中,GIT 合并分支时选择远程的 dev 分支和本地的 dev 分支,有区别吗
  • MinerU vs PDF-Extract-Kit实战对比:多模态提取谁更准?详细步骤
  • 电商设计必备!Qwen-Image-Layered轻松替换商品背景和文字
  • 颠覆性系统优化工具:Windows Cleaner终极解决方案