繁体   English   中英

在 aws lambda python 函数中捕获异常

[英]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 的不同输出:

  1. 找到一个或多个约会
  2. 没有找到约会
  3. 一些应用程序错误/异常

提出您的问题:您应该为此使用异常处理吗? 是的,但我不会像你那样使用它。

在这种情况下,我只会将它用于“正确”异常,并且 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM