Обработка исключений в функции Async Javascript - PullRequest
0 голосов
/ 12 сентября 2018

Сборка «Process Orchestration Engine» в C ++ в качестве надстройки узла. Из C ++ я вызываю различные предоставленные пользователем фрагменты кода Javascript, в соответствии с жизненным циклом. Вот типичный метод message_in;

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

Моя проблема в том, что я хочу обработать исключения изящно, без необходимости добавления блоков try catch для пользователя. В настоящее время, если исключение происходит в вышеупомянутом методе (в материалах Do), обещание устанавливается отклоненным, и Node стонет на меня за то, что я не обработал его.

Но на стороне C ++ я могу только "вызвать" метод JS, я не вижу способа добавить обработчик catch ().

Я не особо хочу использовать обработчик Global Process.

Может кто-нибудь придумать, как избежать предупреждений Узла, поскольку они утверждают, что остановят процесс для этого в будущих выпусках.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете легко прикрепить обработчик:

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
}
0 голосов
/ 12 сентября 2018

Когда обещание отклонено, запускаются все обработчики .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/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...