201 votes

Comment capturer botocore de NoSuchKey exception?

Je suis en train d'écrire "bonne" python et de capturer une S3 pas une telle erreur de clé avec ceci:

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"

Mais NoSuchKey n'est pas défini et je ne peux pas remonter à l'importation j'ai besoin de l'avoir défini.

e.__class__ est botocore.errorfactory.NoSuchKey mais from botocore.errorfactory import NoSuchKey donne une erreur et from botocore.errorfactory import * ne fonctionne pas non plus et je ne veux pas de capture d'une erreur générique.

242voto

Jose Alban Points 3906
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 ex

113voto

groner Points 721

À l'aide de botocore 1.5, on dirait que le client poignée expose les classes d'exception:

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"

57voto

Randy Points 81

Dans boto3, j'ai été en mesure d'accéder à l'exception des ressources méta client.

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")

47voto

JeffSolo Points 71

Je pense que la façon la plus élégante de le faire est en Boto3 est

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")

La documentation sur la gestion des erreurs semble rares, mais les épreuves suivantes les codes d'erreur, cela fonctionne pour:

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 objet au 0x105e08c50 > objet n'a pas d'attribut "InvalidBucketName'. Les exceptions valides sont: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X