【问题标题】:How can I use async lambdas without a try/catch block and still have custom error messages?如何在没有 try/catch 块的情况下使用异步 lambda 并且仍然有自定义错误消息?
【发布时间】:2020-05-19 15:34:05
【问题描述】:

我试图避免使用 try catch 将所有等待的调用包装在异步 lambda 中。我想捕获并发送自定义错误响应,但是与 .catch() 相比,将每个等待的调用包装在 try/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
  }

一旦你在一个 lambda 中有 7 个等待的调用,有一堆 try/catch 就不是很好了。使用 Promise 内置 .catch() 有更漂亮的方法吗?

【问题讨论】:

  • 是的,您可以将.catch()await 一起使用,它会返回一个承诺。
  • Bergi,但我无法在 catch 中返回 eventResponse,因为它在 catch 块中返回,而不是在整个 lambda 中返回。
  • 此时,为什么不使用所有的 Promise 呢?
  • ew,你的意思是有一层很深的承诺链?
  • 不要这样,这取决于偏好。我个人喜欢它

标签: javascript aws-lambda async-await


【解决方案1】:

The .catch() method is compatible with 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;
  }
};

【讨论】:

  • 啊太棒了,不知道为什么我完全忘记了我可以重新扔它。然后我假设 lambda 只是将错误消息作为响应内容。
  • 是的,我已经预料到了,我只是不确定您的目标是否也是设置自定义状态代码等。您也许可以省略 try/catch 块,让 lamda runner 处理错误。
  • dang,我想我仍然必须使用 try/catch。如果我只是抛出预期的消息,我会得到“未处理的承诺拒绝”。
  • @FlavorScape 噢,我希望在 lambda 中有更多,但您仍然可以 use your own wrapper 处理错误处理,以便您只需编写 exports.handler = handleErrors(async(event, context) { … });
  • 是的,你会认为他们只是在内部有重新抛出的错误发出带有重新抛出错误消息的响应,就像回调一样......叹息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2011-08-25
  • 2022-11-02
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多