如何让错误栈追踪自定义代码调用位置而非AWS SDK内部抛出点?
问题:AWS SDK错误栈无法追踪自定义函数调用位置
代码示例
import { s3 } from 'aws-sdk' async function usecase() { await myLogic1() } async function myLogic1() { //... my logic await s3.putObject() }
错误栈信息
at Request.extractError (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/services/s3.js:711:35) at Request.callListeners (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/sequential_executor.js:106:20) at Request.emit (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/sequential_executor.js:78:10) at Request.emit (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/request.js:686:14) at Request.transition (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/request.js:22:10) at AcceptorStateMachine.runTo (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/state_machine.js:14:12) at /Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/state_machine.js:26:10) at Request.<anonymous> (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/request.js:38:9) at Request.<anonymous> (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/request.js:688:12) at Request.callListeners (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/sequential_executor.js:116:18) at Request.emit (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/sequential_executor.js:78:10) at Request.emit (/Users/justinkao/working/AUTO-ops/mission-sticker/mission-sticker-pipeline/node_modules/aws-sdk/lib/request.js:686:14)
问题描述
调用s3.putObject抛出错误时,错误栈仅显示AWS SDK内部的函数调用,无法定位到自定义函数myLogic1()或usecase()的调用位置,如何让错误栈包含自定义代码的调用信息?
解决方案
方法1:手动捕获错误并保留调用栈
AWS SDK v2的方法默认使用回调模式,直接await s3.putObject()无法正确触发Promise链式调用,需先调用.promise()转为Promise,再通过try-catch捕获错误,创建包含当前调用栈的新错误并关联原始错误:
async function myLogic1() { //... my logic try { // 需传入合法参数,此处仅示例结构 await s3.putObject({ Bucket: 'your-bucket', Key: 'your-key', Body: 'content' }).promise(); } catch (err) { const customError = new Error(`执行S3上传失败: ${err.message}`); // 将原始错误作为cause保留,确保完整错误信息不丢失 customError.cause = err; throw customError; } }
抛出的自定义错误栈会包含myLogic1()和usecase()的调用位置,同时通过cause字段保留SDK原始错误细节。
方法2:使用Error.captureStackTrace补充栈信息
如果需要更精细的栈控制,可以手动捕获当前调用栈并附加到原始错误上:
async function myLogic1() { //... my logic const stackHolder = {}; Error.captureStackTrace(stackHolder, myLogic1); try { await s3.putObject(params).promise(); } catch (err) { // 将自定义栈拼接到原始错误栈末尾 err.stack += '\n' + stackHolder.stack; throw err; } }
方法3:升级到AWS SDK v3
AWS SDK v3采用模块化设计,原生支持Promise,错误栈会自动保留上层自定义函数的调用上下文。示例代码:
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; const s3Client = new S3Client({ region: 'your-region' }); async function myLogic1() { //... my logic const command = new PutObjectCommand({ Bucket: 'your-bucket', Key: 'your-key', Body: 'content' }); await s3Client.send(command); }
此时抛出的错误栈会直接包含myLogic1()和usecase()的调用位置,无需额外处理。
内容的提问来源于stack exchange,提问作者高欣平
相关产品推荐
相关产品推荐

