javascript - 我可以在不使用await的情况下捕获异步错误吗?

标签 javascript async-await promise ecmascript-2016

可以捕获来自非等待异步调用的错误,将其发送到原始封装 try/catch,或引发未捕获的异常吗?

以下是我的意思的示例:

async function fn1() {
    console.log('executing fn1');
}

async function fn2() {
    console.log('executing fn2');
    throw new Error('from fn2');
}

async function test() {
    try {
        await fn1();
        fn2();
    }
    catch(e) {
        console.log('caught error inside test:', e);
    }
}

test();

在这种情况下,从fn2抛出的错误将被默默地吞噬,并且绝对不会被原始的try/catch捕获。我相信这是预期的行为,因为 fn2 很可能被推到事件循环中以在将来的某个时刻完成,而 test 并不关心它何时完成完成(这是故意的)。

有没有什么方法可以确保错误不会被这样的结构意外吞没,除了将 try/catch 内部放入 fn2 并执行诸如发出之类的操作之外一个错误?我想,我什至会满足于不知道如何捕获它的未捕获错误 - 我不希望抛出的错误成为我正在编写的典型程序流程,但吞下错误会使调试变得相对烦人。

旁注,我使用 Babel 来使用 babel-runtime 转换来转译代码,并使用节点执行它。

最佳答案

处理未处理的被拒绝的 native Promise(并且 async/await 使用 native Promise)是 V8 中现在支持的功能。它在最新的 Chrome 中用于在未处理被拒绝的 Promise 时输出调试信息;尝试以下地址 the Babel REPL :

async function executor() {
  console.log("execute");
}

async function doStuff() {
  console.log("do stuff");
  throw new Error("omg");
}

function handleException() {
  console.error("Exception handled");
}

(async function() {
  try {
      await executor();
      doStuff();
  } catch(e) {
      handleException();
  }
})()

您会看到,即使 doStuff() 的异常丢失(因为我们在调用它时没有使用 await),Chrome 也会记录拒绝的情况控制台未处理 promise :

Screenshot

这在 Node.js 4.0+ 中也可用,尽管它需要监听 a special unhandledRejection event :

process.on('unhandledRejection', function(reason, p) {
    console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
    // application specific logging, throwing an error, or other logic here
});

关于javascript - 我可以在不使用await的情况下捕获异步错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649994/

相关文章:

javascript - Q.all 用于解决一系列 promise

javascript - 如何在 React JS 中导入整个 javascript 文件

javascript - 关于 Backbone + React 应用程序中模型的混淆

javascript - 我可以在哪个文件中放置一个脚本来清除 Titanium 应用程序的缓存

javascript - Jquery - 使用 jquery 从文本中检测并获取 url

javascript - Node promise 循环等待结果

c# - 如何更好地理解 "Async - Handling multiple Exceptions"文章中的代码/语句?

c++ - winrt/c++ : await result from dispatched task

c# - 使用C#的电子邮件发送问题

javascript - Firebase,异步检索数据