捕获aws lambda python函数中的异常

2024-06-28 20:53:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始学习aws lambda函数,并编写了一个从dynamodb表中获取一些数据的函数。 这就是功能:

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块中是不好的做法,那么有没有更好的方法来处理fetchAppointment函数中可能出现的任何异常


Tags: lambda函数importeventreturnloggingdeferror
2条回答

解决这样的问题有不同的方法,但基本事实是:这总是取决于你想做什么。因此,下面的建议可能适用于这个特定的情况,但可能不适用于其他使用情况。因此,采取以下与盐粒

也就是说,首先要分析的是fetchAppointments()函数的不同输出:

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

接下来是您的问题:您应该为此使用异常处理吗?是的,但我不会像你那样频繁地使用它

在这种情况下,我只会将其用于“适当”的异常,其余部分应该由“正常”应用程序逻辑覆盖

考虑处理程序的以下简化版本:

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)

正如您所看到的,只有“真正的”应用程序异常通过异常处理来处理,其余的只是使用“正常”逻辑来判断是否有约会

代码质量当然是一件好事,我们不必从头开始,依我的经验,我学到的是

它应该先起作用,然后看起来漂亮

但在云计算中,还有更多的内容,它还应该在成本方面进行优化

因此,通过处理异常,您已经在正确的路径上开始了

如果不处理异常并让函数失败,默认情况下,lambda将尝试执行它3次

所以你会被指控执行死刑。您可以自定义this behaviour

就处理异常而言,@Jens解释得非常好

相关问题 更多 >