Aws lambda 在dynamodbpython查询中捕获异常
我试图使用分区键从dynamodb获取值,如果找到分区键值,代码工作正常。但当未找到分区键时,会抛出异常,并且不会捕获该异常 在代码中,我使用了自定义层d_c_fun,其中定义了logger函数。 我用下面的逻辑尝试了elseif函数。 如果找到分区键“data_id”,则正确返回值。但当键值不存在时,它将抛出错误,而不是从异常块中给出响应,如下所示Aws lambda 在dynamodbpython查询中捕获异常,aws-lambda,amazon-dynamodb,boto3,dynamodb-queries,Aws Lambda,Amazon Dynamodb,Boto3,Dynamodb Queries,我试图使用分区键从dynamodb获取值,如果找到分区键值,代码工作正常。但当未找到分区键时,会抛出异常,并且不会捕获该异常 在代码中,我使用了自定义层d_c_fun,其中定义了logger函数。 我用下面的逻辑尝试了elseif函数。 如果找到分区键“data_id”,则正确返回值。但当键值不存在时,它将抛出错误,而不是从异常块中给出响应,如下所示 import json import boto3 import logging import d_c_fun as cf LOGGER = cf
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:当数据id在下表中匹配时。
输入事件
{“D_Id”:“data2”}
代码的输出:
{“table_name”:“data2”,“data_id”:“data2”}
2)o/p:当数据id与下表不匹配时。
输入事件值:
{“D_Id”:“数据”}
代码的输出:
{“errorMessage”:“Item',“errorType”:“KeyError”,“stackTrace”:[ lambda\u handler\n LOGGER.info(\'s:%s\'的响应输出值),D\u Id,“,”文件\“/var/task/demo.py\”,第23行, resp['Item'])\n“]} 如果数据id不匹配,则预期的o/p应为。 数据库中不存在提供的数据\u id-数据” 3)o/p:当数据id作为空值传递时。 输入事件值: {“D_Id”:“”} 代码的输出: {“errorMessage”:“未传递数据id值”,“errorType”: “异常”、“堆栈跟踪”:[ lambda\u处理程序中的“File\”/var/task/demo.py\”,第18行,引发异常(\“data\u id not set\”)\n“]} 预期输出应为。
“errorMessage:“未传递数据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)
我也开发了这段代码,它的工作原理与预期一样:)
import json
import boto3
import logging
from botocore.exceptions import ClientError
import d_c_fun as cf
LOGGER = cf.get_logger()
def get_dynamodb_client():
dynamodb = boto3.client('dynamodb', region_name='REGION_NAME')
return dynamodb
def get_dynamodb_resource():
dynamodb = boto3.resource('dynamodb', region_name='REGION_NAME')
return dynamodb
def lambda_handler(event, context):
D_Id = event['D_Id']
if not D_Id:
raise NameError("Field data_id is empty, Please enter data_id")
return resp['Item']
resp = get_dynamodb_resource().Table("TABLE_NAME").get_item(Key={
"data_id":D_Id})
if 'Item' not in resp:
raise KeyError(
'Data "{}" not found. '.format(D_Id) +
'Please enter valid data_id.'
)
return resp['Item']
else:
LOGGER.info("Got the Item Successfully - \n %s", resp['Item'])
return resp['Item']