Як зафіксувати виняток Botocore NoSuchKey?


103

Я намагаюся написати "хороший" python і схопити S3 без такої ключової помилки з цим:

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 *не працює, і я не хочу фіксувати загальну помилку.

Відповіді:


125
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

31

У 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.