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

