Jak przechwycić wyjątek NoSuchKey botocore?


108

Próbuję napisać „dobrego” Pythona i przechwycić S3 bez takiego błędu klucza:

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"

Ale NoSuchKey nie jest zdefiniowany i nie mogę go prześledzić do importu, którego potrzebuję, aby go zdefiniować.

e.__class__jest, botocore.errorfactory.NoSuchKeyale from botocore.errorfactory import NoSuchKeywyświetla błąd i from botocore.errorfactory import *też nie działa, a nie chcę przechwytywać ogólnego błędu.

Odpowiedzi:


133
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

57

Używając botocore 1.5, wygląda na to, że uchwyt klienta ujawnia klasy wyjątków:

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"

Decyduję się na ten, ponieważ jest nowszy i mniej ogólny. Kilka komentarzy na GitHub dotyczących tej metody można znaleźć: github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester Kardziejonek

2
Jeśli zapomniałeś przewijać tak jak ja: Jeśli używasz zasobu wysokiego poziomu ( s3 = boto3.resource("s3")), możesz uzyskać dostęp do klienta, a tym samym do wyjątku za pośrednictwem s3.meta.client.exceptions.NoSuchKey. Zobacz stackoverflow.com/questions/38581465/…
lorey

34

W boto3 mogłem uzyskać dostęp do wyjątku w meta kliencie zasobu.

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

Korzystanie z meta info jest moim zdaniem najbardziej eleganckim sposobem
Tanja Bayer

24

Myślę, że najbardziej eleganckim sposobem na to jest 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")

Dokumentacja dotycząca obsługi błędów wydaje się skromna, ale poniżej znajdują się kody błędów, które to działa:

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)

Obiekt <botocore.errorfactory.S3Exceptions pod adresem 0x105e08c50> nie ma atrybutu „InvalidBucketName”. Prawidłowe wyjątki to: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


Z powodów, które mogą być niezwiązane, kiedy łapię w ten sposób wyjątki, nie rozprzestrzeniają się. (?)
Everett
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.