python - ¿Cómo capturar la excepción NoSuchKey de botocore?
(4)
Estoy tratando de escribir python "bueno" y capturar un S3 sin ese error clave con esto:
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"
Pero NoSuchKey no está definido y no puedo rastrearlo hasta la importación. Necesito tenerlo definido.
e.__class__
es
botocore.errorfactory.NoSuchKey
pero
from botocore.errorfactory import NoSuchKey
da un error y
from botocore.errorfactory import *
tampoco funciona y no quiero capturar un error genérico.
Creo que la forma más elegante de hacerlo es en Boto3 es
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 documentación sobre el manejo de errores parece escasa, pero a continuación se imprimen los códigos de error para los que funciona:
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)
El objeto <botocore.errorfactory.S3Exceptions en 0x105e08c50> no tiene el atributo ''InvalidBucketName''. Las excepciones válidas son: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError
En boto3, pude acceder a la excepción en el meta cliente del recurso.
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")
Usando botocore 1.5, parece que el identificador del cliente expone las clases de excepción:
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"
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