Как я могу использовать asyn c lambdas без блока try / catch и при этом иметь собственные сообщения об ошибках? - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь избежать упаковки всех моих ожидаемых вызовов в асинхронную c лямбду с попыткой перехвата. Я хочу перехватывать и отправлять пользовательские сообщения об ошибках, но синтаксически оборачивать каждый ожидаемый вызов в try / catch по сравнению с .catch(). Есть ли способ сделать что-то вроде этого:

exports.hanlder = async (event, context, callback) => {
  const foo = await bar(baz).catch((error) => {
    eventResponse.statusCode = 503;
    eventResponse.body = JSON.stringify({ message: 'unable to bar' , error});
    // normally we'd callback(null, eventResponse)
  });

Без упаковки в try / catch, как это?

exports.hanlder = async (event, context, callback) => {
  let foo;
  try {
    foo = await bar(baz);
  } catch (error) {
     eventResponse.statusCode = 503;
     eventResponse.body = JSON.stringify({ message: 'unable to bar', error});
     return eventResponse;
  }
  // then do something else with foo

  if (foo.whatever) {
     // some more async calls
  }

Это просто нехорошо иметь кучу попыток / поймать, когда у вас есть 7 ожидаемых вызовов в одной лямбде. Есть ли более красивый способ сделать это, используя встроенное обещание .catch()?

1 Ответ

3 голосов
/ 03 февраля 2020

Метод .catch() совместим с async / await и часто менее уродлив, если вы хотите повторно вызвать исключение. Я думаю, что вы ищете

exports.handler = async (event, context, callback) => {
  try {
    const foo = await bar(baz).catch(error => {
      throw {message: 'unable to bar', error};
    });
    // do something with `foo`, and more `await`ing calls throwing other errors
    // return a response
  } catch(err) {
    eventResponse.statusCode = 503;
    eventResponse.body = JSON.stringify(err);
    return eventResponse;
  }
};
...