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

如何让错误栈追踪自定义代码调用位置而非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,提问作者高欣平

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:30:52