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

时间:2015-11-06 08:18:47

标签: javascript asynchronous error-handling async-await

以下是一些代码:

  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))

2 个答案:

答案 0 :(得分:3)

所以它有点棘手,但是你没有发现错误的原因是因为,在顶层,整个脚本可以被认为是同步函数。您想要异步捕获的任何内容都需要包含在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错误。

答案 1 :(得分:0)

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);
}