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

12

这是一些代码:

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

我认为你应该在异步函数本身中捕获异常。 - zb'
更新:仍然无法工作 @zb' - ThomasReggi
3个回答

7

1
我刚刚发现你可以像平常一样抛出异常,然后使用.catch(如上所示)。你的方法对我不起作用。 - ThomasReggi
@ThomasReggi 这个链接声称它应该可以工作(并且也会抛出异常)。也许这是babel的一个bug?是的,.catch()会起作用,但我认为你的问题是关于能否try(){}catch(){}它。 - Ruan Mendes
据我所知,您只能在异步函数内使用await关键字。 - Jehan
@jehan 在函数前面加上它,表示你可以使用 await 调用它。https://jakearchibald.com/2014/es7-async-functions/ - Ruan Mendes
使用axios promises对我有效。 - luckydonald

5

因此,这有点棘手,但你没有捕获错误的原因是因为,在顶级层面上,整个脚本可以被视为一个同步函数。任何想要异步捕获的内容都需要用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中,还有一个全局unhandledRejection事件在process上,您可以使用它来捕获所有Promise错误。

0

要从异步函数中捕获错误,可以使用await关键字:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接