如何捕获异步函数引发的错误?

时间:2018-12-16 15:17:09

标签: javascript promise async-await

try {
  const promise = new Promise(async (resolve, reject) => {
    reject('oe')
  })
  .catch(async (err) => {
    console.log('bbbbb', err)
    throw err
  })
} catch (err) {
  console.log('aaaaa', err)
}

可以使aaaaa可记录

2 个答案:

答案 0 :(得分:3)

通常,将async函数传递给诺言的thencatch函数是没有意义的。而且,将一个传递给promise构造器也没有任何意义。如果您要去async,请早点做。另外,当您想要被拒绝的测试承诺等时,只需使用Promise.reject('oe')

为了使用async / trycatch函数中捕获错误,您必须处于async函数中。在这种情况下,对您的示例所做的最小更改将是await的调用结果:

catch

如果您不在// Assuming this is in an `async` function, making only minimal changes try { const promise = new Promise(async (resolve, reject) => { reject('oe') }) .catch(async (err) => { console.log('bbbbb', err) throw err }) await promise; // *** } catch (err) { console.log('aaaaa', err) } 函数中,则不能使用async / try来捕获来自promise的错误(包括来自catch函数调用的错误) ,因为它们返回了承诺)。相反,您必须使用async返回的承诺:

catch

进行较大的更改,如果您已经在// Assuming this is NOT in an `async` function, making only minimal changes const promise = new Promise(async (resolve, reject) => { reject('oe') }) .catch(async (err) => { console.log('bbbbb', err) throw err }) .catch(err => { console.log('aaaaa', err) }) 函数中,请摆脱asyncthen调用:

catch

答案 1 :(得分:1)

您可以使用async/await

async function test() {
  try {
    const promise = await new Promise(async (resolve, reject) => {
      reject('oe')
    }).catch(async err => {
      console.log('bbbbb', err)
      throw err
    })
  } catch (err) {
    console.log('aaaaa', err)
  }
}
test()