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

AWS Lambda自定义错误消息实现求助:执行失败时拼接输入值与错误信息并存储异常

解决AWS Lambda自定义错误消息与异常存储问题

我来帮你搞定这个自定义错误消息的需求,同时把异常和输入值的存储逻辑也加上,先看Node.js的具体实现:

Node.js 解决方案

首先先修复你原代码里的一个小问题:scan操作不支持KeyConditionExpression,这个参数是给query用的,保留会直接报错,先去掉。然后在错误分支里完成自定义消息拼接和异常存储:

var AWS = require('aws-sdk'); 
var mydocumentClient = new AWS.DynamoDB.DocumentClient(); 

exports.handler = function (event, context, callback) { 
    // 先提取输入的关键数据,做好空值兜底避免额外报错
    const inputData = {
        EventID: event.WorkflowDetail?.EventID || '未知ID',
        DataflowID: event.WorkflowDetail?.DataflowID || '未知数据流ID'
    };

    var params = { 
        TableName: 'TransactionLog', 
        FilterExpression : 'EventID = :EventID and Status = :Status', 
        ExpressionAttributeValues: {
            ":EventID": inputData.EventID,
            ":Status": "progress"
        }, 
        ProjectionExpression: "EventID,DataflowID,Status" 
    }; 

    mydocumentClient.scan(params, function (err, data){ 
        if (err) { 
            // 1. 拼接自定义错误消息
            const customError = new Error(`${err.message} "${JSON.stringify(inputData)}"`);
            
            // 2. 把异常和输入值存储到错误日志表(需提前创建ErrorLog表,主键设为ErrorID)
            const errorLogParams = {
                TableName: 'ErrorLog',
                Item: {
                    ErrorID: context.awsRequestId, // 用Lambda请求ID做唯一标识
                    InputData: inputData,
                    OriginalErrorMessage: err.message,
                    Timestamp: new Date().toISOString(),
                    FullErrorDetails: JSON.stringify(err)
                }
            };

            // 执行错误日志存储,无论存储成功与否都返回自定义错误
            mydocumentClient.put(errorLogParams, (putErr) => {
                if (putErr) {
                    console.error('存储错误日志失败:', putErr);
                }
                callback(customError, null);
            });
        } else { 
            callback(null, data); 
        } 
    }); 
}

关键说明

  • 用JSON.stringify(inputData)把输入的EventID和DataflowID直接拼到错误消息里,和你期望的格式一致
  • 新增了ErrorLog表存储错误信息,包含输入数据、原始错误、时间戳等,方便后续排查问题
  • 给输入数据加了空值兜底,避免因为event.WorkflowDetail不存在导致额外报错
  • 修复了原代码中scan使用KeyConditionExpression的错误

Python 实现建议

如果后续想转用Python,思路是一样的,用try-except捕获异常,拼接消息并存储日志:

import boto3
import json
from datetime import datetime

# 初始化DynamoDB客户端
dynamodb = boto3.resource('dynamodb')
transaction_log_table = dynamodb.Table('TransactionLog')
error_log_table = dynamodb.Table('ErrorLog')

def lambda_handler(event, context):
    try:
        # 提取输入数据,做好空值处理
        input_data = {
            'EventID': event.get('WorkflowDetail', {}).get('EventID', '未知ID'),
            'DataflowID': event.get('WorkflowDetail', {}).get('DataflowID', '未知数据流ID')
        }
        
        # 执行扫描操作
        response = transaction_log_table.scan(
            FilterExpression='EventID = :event_id and Status = :status',
            ExpressionAttributeValues={
                ':event_id': input_data['EventID'],
                ':status': 'progress'
            },
            ProjectionExpression='EventID, DataflowID, Status'
        )
        
        return {
            'statusCode': 200,
            'body': response['Items']
        }
    except Exception as e:
        # 拼接自定义错误消息
        custom_error_msg = f"{str(e)} {json.dumps(input_data)}"
        
        # 存储错误日志
        try:
            error_log_table.put_item(
                Item={
                    'ErrorID': context.aws_request_id,
                    'InputData': input_data,
                    'OriginalErrorMessage': str(e),
                    'Timestamp': datetime.utcnow().isoformat(),
                    'FullErrorDetails': str(e)
                }
            )
        except Exception as put_e:
            print(f"存储错误日志失败: {str(put_e)}")
        
        # 抛出自定义异常,返回给调用方
        raise Exception(custom_error_msg)

额外注意事项

  1. 确保Lambda的执行角色有ErrorLog表的PutItem权限,否则存储日志会失败
  2. 如果你的TransactionLog表数据量较大,scan操作会比较低效,建议改用query(如果EventID是分区键的话)
  3. 可以根据需求调整ErrorLog表的字段,比如添加Lambda函数名、请求上下文等信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:43:13