J'essaie d'écrire "bien" python et de capturer une telle erreur de clé S3 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 le tracer jusqu'à l'importation, il est nécessaire de le définir.
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 capturer une erreur générique.
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
En utilisant botocore 1.5, il semble que le descripteur client 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"
Dans boto3, j'ai pu accéder à l'exception dans le méta client de la ressource.
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")
Je pense que la manière la plus élégante de le faire est de 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")
La documentation sur la gestion des erreurs semble clairsemée, mais ce qui suit imprime les codes d'erreur pour lesquels cela fonctionne:
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)
L'objet <botocore.errorfactory.S3Exceptions à 0x105e08c50> n'a pas d'attribut 'InvalidBucketName'. Les exceptions valides sont: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError.