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

如何在现代JS中用TC39原生装饰器实现方法try-catch包装(非TS实验特性)

基于TC39标准装饰器实现异步方法的Try-Catch包装

下面是符合TC39装饰器提案要求、无需启用TypeScriptexperimentalDecorators配置的实现方案,专为你的Lambda方法添加错误捕获逻辑:

第一步:实现标准装饰器tryCatchWrapper

这个装饰器会包装异步方法,自动添加try-catch逻辑,捕获到错误后可根据需求返回Lambda风格的错误响应或做日志记录:

function tryCatchWrapper(target, propertyKey, descriptor) {
  // 保存原方法的引用
  const originalMethod = descriptor.value;
  
  // 重写方法,添加try-catch逻辑
  descriptor.value = async function(...args) {
    try {
      // 调用原方法并保留this上下文
      return await originalMethod.apply(this, args);
    } catch (error) {
      // 自定义错误处理逻辑,比如日志上报、格式化响应
      console.error('Lambda handler执行出错:', error);
      
      // 返回符合Lambda规范的错误响应
      return {
        statusCode: 500,
        error: error.message,
        stack: process.env.NODE_ENV === 'production' ? undefined : error.stack
      };
    }
  };
  
  // 返回修改后的描述符
  return descriptor;
}

第二步:在类中使用装饰器

直接在异步方法上使用@tryCatchWrapper即可,完全匹配你的示例结构:

class LambdaFunctionExample {
  // 类字段遵循标准语法(无需额外配置)
  lambdaResponse = [1, 2, 3];

  @tryCatchWrapper
  async handler(event) {
    const data = this.lambdaResponse;
    // 模拟异步请求
    const result = await fetch('https://api.example.com/data');
    
    return {
      statusCode: 200,
      data,
      result: await result.json()
    };
  }
}

关键说明

  1. TC39标准兼容:该装饰器完全遵循TC39装饰器提案,不需要启用TypeScript的experimentalDecorators配置。若使用TypeScript,需确保版本在5.0以上,并在tsconfig.json中设置:
    {
      "compilerOptions": {
        "experimentalDecorators": false,
        "useDefineForClassFields": true,
        "target": "ESNext"
      }
    }
    
  2. 上下文保留:通过originalMethod.apply(this, args)确保原方法中的this指向正确的类实例,不会丢失lambdaResponse等类字段的引用。
  3. 异步错误处理:装饰器内部使用async/await捕获错误,覆盖所有异步操作的异常场景。
  4. 可定制化:catch块中的逻辑可根据POC需求修改,比如仅打印错误、抛出特定异常或返回不同格式的响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:05:07