javascript 如何使用async / await捕获抛出的错误?

kmynzznz  于 2023-01-16  发布在  Java
关注(0)|答案(3)|浏览(166)

下面是一些代码:

import 'babel-polyfill'

  async function helloWorld () {
    throw new Error ('hi')
  }

  helloWorld()

我还深入尝试了以下方法:

import 'babel-polyfill'

  async function helloWorld () {
    throw new Error ('hi')
  }

  async function main () {
    try {
      await helloWorld()
    } catch (e) {
      throw e
    }
  }

  main()

以及:

import 'babel-polyfill'

 async function helloWorld () {
   throw new Error ('hi')
 }

try {
 helloWorld()
} catch (e) {
 throw e
}

这是可行的:

import 'babel-polyfill'

async function helloWorld () {
  throw new Error('xxx')
}

helloWorld()
.catch(console.log.bind(console))
2ul0zpep

2ul0zpep1#

所以这有点棘手,但你没有捕捉到错误的原因是,在顶层,整个脚本可以被认为是一个 synchronous 函数,任何你想异步捕捉的东西都需要 Package 在async函数中,或者使用Promises。
例如,它会吸收错误:

async function doIt() {
  throw new Error('fail');
}

doIt();

因为它和这个是一样的:

function doIt() {
  return Promise.resolve().then(function () {
    throw new Error('fail');
  });
}

doIt();

在顶层,您应该始终添加一个普通的Promise样式catch(),以确保错误得到处理:

async function doIt() {
  throw new Error('fail');
}

doIt().catch(console.error.bind(console));

在Node中,process上还有一个全局unhandledRejection事件,您可以使用它来捕获所有Promise错误。

xe55xuns

xe55xuns2#

async is meant to be used with Promises。如果你拒绝了这个承诺,那么你可以catch这个错误,如果你解决了这个承诺,它就变成了这个函数的返回值。

async function helloWorld () {
  return new Promise(function(resolve, reject){
    reject('error')
  });
}

try {
    await helloWorld();
} catch (e) {
    console.log('Error occurred', e);
}
ct2axkht

ct2axkht3#

要从异步函数捕获错误,可以等待错误:

async function helloWorld () {
  //THROW AN ERROR FROM AN ASYNC FUNCTION
  throw new Error('hi')
}

async function main() {
  try {
    await helloWorld()
  } catch(e) {
    //AWAIT THE ERROR WITHIN AN ASYNC FUNCTION
    const error = await e
    console.log(error)
  }
}

main()

或者,您可以等待错误消息:

async function main() {
  try {
    await helloWorld()
  } catch(e) {
    //AWAIT JUST THE ERROR MESSAGE
    const message = await e.message
    console.log(message)
  }
}

相关问题