Come catturare l'eccezione NoSuchKey di botocore?


105

Sto cercando di scrivere Python "buono" e catturare un errore di chiave S3 senza questo:

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"

Ma NoSuchKey non è definito e non riesco a risalire all'importazione di cui ho bisogno per averlo definito.

e.__class__è botocore.errorfactory.NoSuchKeyma from botocore.errorfactory import NoSuchKeydà un errore e from botocore.errorfactory import *non funziona neanche e non voglio catturare un errore generico.

Risposte:


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

Utilizzando botocore 1.5, sembra che l'handle del client esponga le classi di eccezione:

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"

Sto optando per questo, in quanto è più nuovo e anche meno generico. Puoi trovare alcuni commenti su GitHub riguardo a questo metodo: github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester Kardziejonek

Se ti sei dimenticato di scorrere come me: se stai utilizzando la risorsa di alto livello ( s3 = boto3.resource("s3")), puoi accedere al client e quindi all'eccezione tramite s3.meta.client.exceptions.NoSuchKey. Vedere stackoverflow.com/questions/38581465/...
lorey

32

In boto3, sono stato in grado di accedere all'eccezione nel meta client della risorsa.

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

L'utilizzo delle meta informazioni è secondo me il modo più elegante
Tanja Bayer

24

Penso che il modo più elegante per farlo sia in 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 documentazione sulla gestione degli errori sembra scarsa, ma quanto segue stampa i codici di errore per cui funziona:

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'oggetto <botocore.errorfactory.S3Exceptions a 0x105e08c50> non ha l'attributo "InvalidBucketName". Le eccezioni valide sono: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


Per motivi che potrebbero non essere correlati, quando intrappolo le eccezioni in questo modo, non si propagano. (?)
Everett
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.