python botocore

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