aws-lambda - 捕获 Dynamodb Python 查询中的异常

标签 aws-lambda amazon-dynamodb boto3 dynamodb-queries

我正在尝试使用分区键从 dynamodb 获取值,如果找到分区键值,则代码工作正常。但是,当未找到分区键时,会抛出异常并且不会捕获异常。

在代码中,我使用了自定义层 d_c_fun,其中定义了记录器函数。 我尝试过具有以下逻辑的 elseif 函数。 如果找到分区键“data_id”,则正确返回值。但是当键值不存在时,它会抛出错误,而不是从异常 block 中给出响应,如下所示。

import json
import boto3
import logging
import d_c_fun as cf

LOGGER = cf.get_logger()
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('tablename')
def lambda_handler(event, context):

    LOGGER.lambda_init(event, context)
    # Event value received through trigger

    D_Id = event['D_Id']
    if not D_Id:
        raise Exception ("data_id value not passed")
        #LOGGER.error(""data_id value not passed"")
    elif D_Id :
        resp = table.get_item(Key={
        "data_id":D_Id})
        LOGGER.info("Response Output value for the %s: %s", D_Id, resp['Item'])
        return resp['Item']
    else:
        raise Exception ("The data_id - %s provided doesn't exist in db", D_Id)

1) o/p: 当 data_id 与下表匹配时。

输入事件

{ "D_Id": "data2" }

代码输出:

{ "table_name": "data2", "data_id": "data2" }

2) o/p: 当 data_id 与下表不匹配时。

输入事件值:

{ "D_Id": "data" }

代码输出:

{ "errorMessage": "'Item'", "errorType": "KeyError",
"stackTrace": [ " File \"/var/task/demo.py\", line 23, in lambda_handler\n LOGGER.info(\"Response Output value for the %s: %s\", D_Id, resp['Item'])\n" ] }

如果 data_id 不匹配,则应为预期的 o/p。

data_id - 提供的数据在数据库中不存在。

3) o/p: 当 data_id 作为空值传递时。

输入事件值:

{ "D_Id": "" }

代码输出:

{ "errorMessage": "data_id value not passed", "errorType": "Exception", "stackTrace": [ " File \"/var/task/demo.py\", line 18, in lambda_handler\n raise Exception (\"data_id not set\")\n" ] }

预期输出应该是。

"errorMessage": "data_id 值未传递",

最佳答案

我原来的回答完全脱离了你的目的。试试这个。

import json
import boto3
import logging
import d_c_fun as cf

LOGGER = cf.get_logger()
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('tablename')
def lambda_handler(event, context):

    LOGGER.lambda_init(event, context)
    # Event value received through trigger

    D_Id = event['D_Id']
    if not D_Id:
        raise Exception ("data_id value not passed")
        #LOGGER.error(""data_id value not passed"")
    else:
        try:
            resp = table.get_item(Key={"data_id":D_Id})
            LOGGER.info("Response Output value for the %s: %s", D_Id, resp['Item'])
            return resp['Item']
        except:
            raise Exception ("The data_id - %s provided doesn't exist in db", D_Id)

关于aws-lambda - 捕获 Dynamodb Python 查询中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947004/

相关文章:

aws-lambda - 如何通过 lambda 代理集成云形成 API 网关资源

javascript - AWS Lambda Node Js JSON 未定义

amazon-web-services - AWS Lambda-如何处理异步(AWS S3)触发器上的错误?

Mysql 与 MongoDB 和 DynamoDB - 用户跟踪项目

amazon-web-services - 如果我在没有 MaxResults 的情况下调用 EC2 客户端的 "describe_instances"函数,它会返回所有实例吗?

amazon-web-services - 在 boto3 中按 IAM 角色过滤实例?

python - SAM 应用程序工作,但运行 pytest 抛出...ModuleNotFoundError : No module named 'aurora'

amazon-web-services - 自动将 dynamodb 表卸载到 cloudsearch 域

node.js - 我应该使用哪个亚马逊服务来实现基于时间的队列调度程序(无服务器应用程序)?

python - AWS 开发工具包 boto3 相对于 AWS CLI 命令的优势