不要一直使用try-catch啦!三种async/await错误捕获方式

开发 前端
async + await​ 可以让 异步的操作拥有同步的写法。所以在日常开发中,通过 async + await 来处理异步编程(比如:接口请求)是非常常见的一种方案。

Hello,大家好,我是 Sunday。

async + await 可以让 异步的操作拥有同步的写法。所以在日常开发中,通过 async + await 来处理异步编程(比如:接口请求)是非常常见的一种方案。

但是,只要是异步操作,那么就会存在出现 错误 的可能。当 promise 出现错误时,我们可以直接通过 .catch 的方式进行捕获,那么 async + await 应该怎么做呢?每次都使用 try-catch 进行完整的包裹吗?有没有更好地方案呢?

今天这篇文章,咱们就来说下这个问题~

01:使用 try/catch 进行捕获

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('请求出现错误')
         }, 1000)
     })
}

async function loggedIn() {
     try {
         // 执行中断
         let userInfo = await getUserInfo()
         console.log('不会继续执行')
     } catch(e) {
         console.log(e)
     }
}
loggedIn()

上面的代码在执行时,会通过 try-catch 捕获到“请求异常”并中断执行getUserInfo。这也是日常开发中常见处理方式。

但是如果我们存在多次的请求,就必须要通过多次的 try-catch 进行捕获,特别是在请求需要具备连续性的时候:

async function loggedIn() {
     try {
         let userInfo = await getUserInfo()
         console.log('不会继续执行')
         let pageInfo = await getPageInfo(userInfo?.userId)
     } catch(e) {
         console.warn(e)
     }
}
loggedIn()

这样的处理,在当前场景下并没有什么问题,但是如果每一个接口的请求都这么进行调用,那么就会显得冗余了。所以,我们就可以延伸出一些其他的处理方案。

02:直接捕获

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('请求出现错误')
         }, 1000)
     })
}

async function loggedIn() {
     let userInfo = await getUserInfo().catch(e => console.log(e))
     console.log('程序会继续执行')
     if (!userInfo) return
     let pageInfo = await getPageInfo(userInfo?.userId)
}
loggedIn()

在上面的代码中,我们通过 catch捕获了异常,但程序会继续执行,所以我们只需要在后续进行 if 判断,从而完成连续的逻辑。

如果你不希望程序继续执行,那么可以按照下面的方式进行处理

function getUserInfo() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
             reject('请求出现错误')
         }, 1000)
     })
}

async function loggedIn() {
     let userInfo = await getUserInfo().catch(e => {
         console.log(e)
         return Promise.reject(e)
     })
     console.log('程序不会继续执行')
     let pageInfo = await getPageInfo(userInfo?.userId)
}
loggedIn()

这种方式会执行通过 在catch块中的Promise.reject(e)来中断执行。

如何选择?

1、如果错误不需要中断程序执行,那么可以使用如下方式

let userInfo = await getUserInfo().catch(e => console.log(e))
if (!userInfo) return

2、如果发生错误时需要中断,并且通过控制台明确一个统一的错误

try {
   let userInfo = await getUserInfo()
   console.log('不会继续执行')
   let pageInfo = await getPageInfo(userInfo?.userId)
} catch(e) {
   console.warn(e)
}

3、如果发生错误时需要中断,但是不需要控制台显示统一的错误

let userInfo = await getUserInfo().catch(e => {
   console.log(e)
   return Promise.reject(e)
})
console.log('程序不会继续执行')
let pageInfo = await getPageInfo(userInfo?.userId)
责任编辑:武晓燕 来源: 程序员Sunday
相关推荐

2017-11-02 15:26:10

JavaScriptasync错误

2020-09-27 07:48:40

不用try catch

2009-07-21 14:30:38

Scalatry-catch

2024-05-24 08:59:15

2024-06-25 10:37:11

2024-11-04 08:20:00

try-catch编程

2024-05-07 07:58:47

C#程序类型

2024-11-11 11:33:57

2021-01-05 07:54:55

事项trycatch

2024-03-05 18:15:28

AsyncAwait前端

2020-05-29 08:14:49

代码Try-Catch程序员

2020-10-14 12:10:22

Javatry-catch代码

2022-01-25 12:14:39

面试try-catch代码

2021-11-26 11:07:14

cowsay命令Linux

2012-07-22 15:59:42

Silverlight

2012-07-17 09:16:16

SpringSSH

2009-11-06 10:54:19

WCF服务方式

2024-07-08 09:03:31

2012-11-09 13:42:29

数据库数据大数据

2012-05-15 11:29:41

数据库
点赞
收藏

51CTO技术栈公众号