Как зафиксировать исключение Botocore NoSuchKey?


105

Я пытаюсь написать "хороший" питон и записать ошибку S3 no such key с помощью этого:

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except NoSuchKey as e:
    print >> sys.stderr, "no such key in bucket"

Но NoSuchKey не определен, и я не могу отследить его до импорта, который мне нужен для его определения.

e.__class__есть, botocore.errorfactory.NoSuchKeyно from botocore.errorfactory import NoSuchKeyвыдает ошибку и from botocore.errorfactory import *тоже не работает, и я не хочу фиксировать общую ошибку.

Ответы:


127
from botocore.exceptions import ClientError

try:
    response = self.client.get_object(Bucket=bucket, Key=key)
    return json.loads(response["Body"].read())
except ClientError as ex:
    if ex.response['Error']['Code'] == 'NoSuchKey':
        logger.info('No object found - returning empty')
        return dict()
    else:
        raise

51

Используя botocore 1.5, похоже, что дескриптор клиента предоставляет классы исключений:

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except client.exceptions.NoSuchKey as e:
    print >> sys.stderr, "no such key in bucket"

Я выбираю этот, поскольку он более новый и менее общий. Вы можете найти комментарии к этому методу на GitHub: github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester Kardziejonek

Если вы забыли прокрутить, как я: если вы используете ресурс высокого уровня ( s3 = boto3.resource("s3")), вы можете получить доступ к клиенту и, следовательно, к исключению через s3.meta.client.exceptions.NoSuchKey. См stackoverflow.com/questions/38581465/...
Lorey

32

В boto3 мне удалось получить доступ к исключению в мета-клиенте ресурса.

import boto3

s3 = boto3.resource('s3')
s3_object = s3.Object(bucket_name, key)

try:
    content = s3_object.get()['Body'].read().decode('utf-8')
except s3.meta.client.exceptions.NoSuchKey:
    print("no such key in bucket")

Я считаю, что использование метаинформации самый элегантный способ
Таня Байер,

24

Я думаю, что самый элегантный способ сделать это в Boto3 -

session = botocore.session.get_session()
client = session.create_client('s3')

try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except client.exceptions.NoSuchKey:
    print("no such key in bucket")

Документация по обработке ошибок кажется скудной, но ниже приведены коды ошибок, для которых это работает:

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    try:
        client.get_object(Bucket=BUCKET, Key=FILE)
    except client.exceptions.InvalidBucketName:
        print("no such key in bucket")
except AttributeError as err:
    print(err)

Объект <botocore.errorfactory.S3Exceptions по адресу 0x105e08c50> не имеет атрибута InvalidBucketName. Допустимые исключения: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError.


По причинам, которые могут быть не связаны, когда я перехватываю исключения таким образом, они не распространяются. (?)
Эверетт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.