You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda@Edge异步错误处理:throw与callback返回Error是否等价?

Lambda@Edge异步函数中throw Error与回调传参的等价性及最佳实践

一、throw new Error()与回调传错误是否等价?

  • 从Lambda运行时的处理逻辑来说,完全等价。Lambda对异步函数的规则是:如果函数抛出异常,运行时会自动将这个异常作为回调的第一个参数传递,和手动调用callback(new Error("invalid token"))的效果一致。
  • 但要注意:无论是throw异常还是回调传错误,CloudFront都会将其视为Lambda执行失败,最终返回给用户的是502 Bad Gateway错误,而非你自定义的错误状态码。

二、返回错误还是自定义HTTP响应?

返回带正确状态码的响应对象是更优方案,原因如下:

  • throw异常会触发CloudFront的默认错误页面,用户体验差,且无法传递自定义错误信息;
  • 返回自定义响应可以精准控制状态码(比如用401 Unauthorized对应无效token)、响应体和HTTP头部,符合HTTP语义,也能给客户端明确的错误提示。

示例代码对比:

不推荐:throw异常

exports.handler = async (event) => {
  const token = event.Records[0].cf.request.headers['authorization']?.[0]?.value;
  if (!token || !isValidToken(token)) {
    throw new Error("invalid token");
  }
  return event.Records[0].cf.request;
};

这种方式会让CloudFront返回502错误,用户看不到"invalid token"的具体提示。

推荐:返回自定义响应

exports.handler = async (event) => {
  const token = event.Records[0].cf.request.headers['authorization']?.[0]?.value;
  if (!token || !isValidToken(token)) {
    return {
      status: '401',
      statusDescription: 'Unauthorized',
      headers: {
        'content-type': [{ key: 'Content-Type', value: 'application/json' }],
      },
      body: JSON.stringify({ error: "invalid token" }),
    };
  }
  return event.Records[0].cf.request;
};

这种方式会直接返回401状态码和自定义错误体,客户端能清晰知晓错误原因。

内容的提问来源于stack exchange,提问作者Omiron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:13:14