Правильно поймать 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