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.NoSuchKey
ale from botocore.errorfactory import NoSuchKey
wyświetla błąd i from botocore.errorfactory import *
też nie działa, a nie chcę przechwytywać ogólnego błędu.
s3 = boto3.resource("s3")
), możesz uzyskać dostęp do klienta, a tym samym do wyjątku za pośrednictwems3.meta.client.exceptions.NoSuchKey
. Zobacz stackoverflow.com/questions/38581465/…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")
źródło
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)
źródło