[英]Catching exceptions in aws lambda python functions
我刚刚进入 aws lambda 函数并编写了一个 function 从 dynamodb 表中获取一些数据。 这是 function:
import boto3
from boto3.dynamodb.conditions import Key, Attr
import botocore.exceptions
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
dynamodb=boto3.resource('dynamodb')
appointmentsTable = dynamodb.Table('Appointments')
class NotFoundError(Exception):
pass
def lambda_handler(event, context):
try:
logger.info(f'event: {event}')
bookedAppointments = fetchAppointments(event)
logger.info(f'Response: {bookedAppointments}')
return sendResponse(True , 200 , 'Appointments found' , bookedAppointments)
except NotFoundError:
return sendResponse(True , 400, 'No booked appointments Found' , [])
except Exception as error:
return sendResponse(False , 500 , 'Error in fetch booked appointments' , str(error))
def sendResponse(success , statusCode , message , responseData):
return {
'success' : success,
'statusCode' : statusCode,
'message': message,
'responseData' : responseData
}
def fetchAppointments(event):
consId = event.get('consId')
try:
bookedAppointments = appointmentsTable.query(
IndexName = 'consId-index',
KeyConditionExpression = Key('consId').eq(consId),
FilterExpression = 'booked=:b',
ExpressionAttributeValues = {
':b' : True
}
)
except botocore.exceptions.ClientError as error:
logger.exception(f'Error in fetchAppointments function: {error}')
raise error
if bookedAppointments.get('Items') == []:
raise NotFoundError
sortedResult = sortResult(bookedAppointments.get('Items'))
return sortedResult
def sortResult(listTobeSorted):
return sorted(listTobeSorted , key=lambda k: (k['appointmentDate'] , k['appointmentSlot']))
我知道将所有代码逻辑包装在 try-catch 块中是不好的做法,所以有没有更好的方法来处理 fetchAppointments function 中可能发生的任何异常?
有不同的方法来解决这样的问题,但基本的事实是:它总是取决于你想做什么。 因此,以下建议可能适用于这种特定情况,但可能不适用于其他用例。 因此,请注意以下几点。
也就是说,首先要分析的是fetchAppointments()
function 的不同输出:
提出您的问题:您应该为此使用异常处理吗? 是的,但我不会像你那样使用它。
在这种情况下,我只会将它用于“正确”异常,并且 rest 应该被“正常”应用程序逻辑覆盖。
考虑以下处理程序的简化版本:
def lambda_handler(event, context):
try:
appointments = fetchAppointments(event)
except Exception as error:
return sendResponse(False, 500, 'Error in fetch booked appointments', str(error))
if not appointments:
return sendResponse(True, 400, 'No booked appointments Found', [])
return sendResponse(True, 200, 'Appointments found', appointments)
如您所见,只有“真正的”应用程序异常通过异常处理来处理,而 rest 仅使用“正常”逻辑来确定是否有约会。
代码质量当然是一件好事,我们不必从头开始IMO,根据我的经验,我学到的是
它应该首先工作,然后它应该看起来很漂亮
但在云中,它还有更多功能,它也应该在成本方面进行优化。
因此,您已经通过处理异常开始了正确的道路
如果您不处理异常并让 function 失败,默认情况下 lambda 会尝试执行 3 次
所以你会为这些处决付费。 您可以自定义此行为
就处理异常而言,@Jens 解释得非常好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.