Я только что начал работать с лямбда-функциями aws и написал функцию, которая извлекает некоторые данные из таблицы 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 — плохая практика, так есть ли лучший способ обработки любых исключений, которые могут возникнуть в функции fetchAppointments?
Существуют разные способы решения подобных проблем, но основная истина такова: все всегда зависит от того, что вы хотите сделать. Таким образом, следующий совет может подойти для этого конкретного случая, но может не подойти для других вариантов использования. Так что отнеситесь к следующему с недоверием.
Тем не менее, первое, что нужно проанализировать, — это различные выходные данные вашей функции fetchAppointments()
:
Переходя к вашему вопросу: следует ли использовать для этого обработку исключений? Да, но я бы не использовал его так часто, как ты.
В этом случае я бы использовал его только для «правильного» исключения, а остальное должно быть покрыто «нормальной» логикой приложения.
Рассмотрим следующую упрощенную версию вашего обработчика:
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)
Как видите, только «настоящее» исключение приложения обрабатывается с помощью обработки исключений, а остальные просто используют «нормальную» логику, чтобы выяснить, есть ли встречи или нет.
Качество кода, безусловно, хорошо, нам не нужно начинать с нуля, IMO. По моему опыту, я узнал, что
сначала должно работать, а потом выглядеть красиво
Но в облаке это еще не все, оно должно быть оптимизировано и с точки зрения затрат.
Итак, вы уже начали на правильном пути, уже обработав исключение
Если вы не обработаете исключение и допустите сбой функции, по умолчанию лямбда попытается выполнить ее 3 раза.
Таким образом, вам будет предъявлено обвинение за эти казни. Вы можете настроить это поведение
Что касается обработки исключения, @Jens объяснил это очень хорошо.