在异步Javascript函数中处理异常

时间:2018-09-12 12:22:58

标签: javascript async-await v8

在C ++中构建“流程编排引擎”作为节点附加组件。根据生命周期,我从C ++调用各种用户提供的Javascript代码段。这是典型的“ message_in”方法;

async message_in(msg) {
    // Do stuff
    await supervisor->send_message(xxx);
    // Do more stuff
}

我的问题是我想优雅地处理异常,而无需用户添加try catch块。当前,如果上述方法(在“做”中的东西)中发生异常,则将诺言设置为拒绝,并且Node抱怨我没有处理它。

但是在C ++方面,我只能“调用” JS方法,看不到添加catch()处理程序的方法。

我不想特别使用Global Process处理程序。

任何人都可以想到一种避免Node警告的方法,因为他们声称将在以后的版本中关闭此过程。

2 个答案:

答案 0 :(得分:1)

当一个承诺被拒绝时,任何分配给该承诺的.catch处理程序都会被触发,您可以做什么:

async function message_in(msg) {
  await (async () => {
    // Do stuff
    await supervisor->send_message(xxx)
    // Do more stuff
  })().catch((e) => {
      return e; // or do sth sensible with the error
  });
}

这确实使您的方法有些肿,但是您可以使用函数/方法修饰符(https://www.sitepoint.com/javascript-decorators-what-they-are/)提取出来

答案 1 :(得分:0)

您可以很容易地附加处理程序:

Local<Value> res;
TryCatch try_catch(isolate);
if (fn->Call(...).ToLocal(&res)) {
  if (res->IsPromise()) {
    res.As<Promise>()->Catch(context, errorHandlerFunction);
  }
} else {
  // check try_catch
}