Estoy tratando de escribir Python "bueno" y capturar un S3 sin tal error de 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 definirlo.
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.
s3 = boto3.resource("s3")
), puede acceder al cliente y, por lo tanto, a la Excepción a través des3.meta.client.exceptions.NoSuchKey
. Ver stackoverflow.com/questions/38581465/…En boto3, pude acceder a la excepción en el metacliente 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")
fuente
Creo que la forma más elegante de hacer esto 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 lo siguiente imprime 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)
fuente