¿Cómo capturar la excepción NoSuchKey de botocore?


105

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.NoSuchKeypero from botocore.errorfactory import NoSuchKeyda un error y from botocore.errorfactory import *tampoco funciona y no quiero capturar un error genérico.

Respuestas:


127
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

51

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"

Estoy optando por este, ya que es más nuevo y menos genérico. Puede encontrar algunos comentarios en GitHub con respecto a este método: github.com/boto/boto3/issues/1262#issuecomment-329314670
— Sylwester Kardziejonek

Si olvidó desplazarse como yo: si está utilizando el recurso de alto nivel ( s3 = boto3.resource("s3")), puede acceder al cliente y, por lo tanto, a la Excepción a través de s3.meta.client.exceptions.NoSuchKey. Ver stackoverflow.com/questions/38581465/…
— lorey

32

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

Usar la metainformación es, en mi opinión, la forma más elegante
— Tanja Bayer hace

24

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)

<botocore.errorfactory.S3Exceptions objeto en 0x105e08c50> el objeto no tiene atributo 'InvalidBucketName'. Las excepciones válidas son: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


Por razones que pueden no estar relacionadas, cuando atrapo Excepciones de esta manera, no se propagan. (?)
— Everett
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.