首页 > 解决方案 > 如何捕获从异步函数重新抛出的错误?

问题描述

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记录

标签: javascriptpromiseasync-await

解决方案


async通常,将函数传递给 promisethen或函数是没有意义的catch。将一个传递给 Promise 构造函数是没有意义的。如果你要去,早点去async。此外,当您想要一个被拒绝的测试承诺等时,只需使用Promise.reject('oe').

为了从async带有try/的函数中捕获错误catch,您必须在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/catch来捕获来自 Promise 的错误(包括来自async函数调用,因为它们返回 Promise)。相反,您必须使用返回的承诺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)
})

进行较大的更改,如果您已经在一个async函数中,请摆脱thenandcatch调用:

// Assuming this is in an `async` function
try {
  try {
    await Promise.reject('oe');
  } catch (innerError) {
    console.log('bbbbb', innerError);
    throw innerError;
  }
} catch (outerError) {
  console.log('aaaaa', outerError);
}

推荐阅读