Правильно поймать boto3 Ошибки
Я разрабатываю приложение django, которое общается с несколькими веб-службами Amazon.
До сих пор у меня возникли проблемы с устранением исключений, вызванных клиентом boto3. То, что я делаю, кажется излишне утомительным:
Пример:
client = boto3.client('sns')
client.create_platform_endpoint(PlatformApplicationArn=SNS_APP_ARN, Token=token)
это может вызвать botocore.errorfactory.InvalidParameterException
, если, например, токен плох.
client.get_endpoint_attributes(EndpointArn=endpoint_arn)
может вызвать botocore.errorfactory.NotFoundException
.
Во-первых, я не могу найти эти ошибки в любом месте кода, поэтому они, вероятно, сгенерированы где-то. Итог: я не могу импортировать его и поймать как обычно.
Во-вторых, я нашел один способ поймать ошибку здесь, используя:
try:
# boto3 stuff
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'NotFound':
# handle exception
else:
raise e
Но мне нужно удалить часть Exception
имени ошибки. Кажется очень случайным, и я не знаю, удалю ли я Error
в botocore.exceptions.ParamValidationError
, если захочу его поймать. Поэтому трудно обобщить.
Другой способ поймать ошибку - использовать клиентский объект boto3, который я получил:
try:
# boto3 stuff
except client.exceptions.NotFoundException as e:
# handle exception
Это кажется самым чистым способом до сих пор. Но у меня не всегда есть клиентский объект boto3, где я хочу поймать ошибку. Кроме того, я все еще только пытаюсь разобраться, поэтому он в основном угадывает работу.
Кто-нибудь знает, как должны обрабатываться ошибки boto3?
Или можете указать мне на какую-то согласованную документацию, в которой упоминаются ошибки выше? Благодаря
Ответы
Ответ 1
Вы хорошо суммировали ситуацию. В старом boto
был простой жестко заданный подход к поддержке API-интерфейсов AWS. boto3
, что, по-видимому, является попыткой сократить накладные расходы на синхронизацию клиента Python с развивающимися функциями на различных API-интерфейсах, было более изощренным в отношении исключений, поэтому подход ClientError, который вы описали выше, был каноническим.
о>В 2017 году они представили второй механизм, который вы выделили: "смоделированные" исключения, доступные на клиенте.
Я не знаком с SNS, но по своему опыту работы с другими продуктами AWS именование ClientError совпадает с HTTP-API, которые, как правило, хорошо документированы. Поэтому я бы начал здесь: https://docs.aws.amazon.com/sns/latest/api/Welcome.html
Похоже, что смоделированные исключения нового стиля генерируются из файлов определения сервиса, которые находятся в модуле botocore. Я не могу найти какую-либо документацию об этом, но просмотрите модели сервиса AWS в https://github.com/boto/botocore/tree/master/botocore/data.
Также полезно знать, что если вы (в отличие от кода OP) не имеете дела непосредственно с клиентом низкого уровня, а вместо этого используете объект AWS ServiceResource
высокого уровня, клиент низкого уровня по-прежнему легко доступен. на my_service_resource.meta.client
, чтобы вы могли обрабатывать такие исключения:
try:
my_service_resource.do_stuff()
except my_service_resource.meta.client.exceptions.NotFoundException as e:
# handle exception
Ответ 2
Используйте исключения Boto3: https://www.programcreek.com/python/example/97944/boto3.exceptions
client = boto3.client('logs')
try:
client.create_log_group(logGroupName=LOG_GROUP)
except client.exceptions.ResourceAlreadyExistsException:
pass