Làm thế nào để nắm bắt ngoại lệ NoSuchKey của botocore?


104

Tôi đang cố gắng viết python "tốt" và chụp một S3 không có lỗi chính như vậy với điều này:

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"

Nhưng NoSuchKey không được định nghĩa và tôi không thể theo dõi nó đến lần nhập mà tôi cần xác định nó.

e.__class__botocore.errorfactory.NoSuchKeynhưng from botocore.errorfactory import NoSuchKeyđưa ra một lỗi và from botocore.errorfactory import *cũng không hoạt động và tôi không muốn ghi lại một lỗi chung.

Câu trả lời:


126
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

Sử dụng botocore 1.5, có vẻ như trình xử lý máy khách hiển thị các lớp ngoại lệ:

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"

Tôi chọn cái này, vì nó mới hơn và cũng ít chung chung hơn. Bạn có thể tìm thấy một số nhận xét trên GitHub về phương pháp này: github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester Kardziejonek

Nếu bạn quên cuộn giống như tôi: Nếu bạn đang sử dụng tài nguyên cấp cao ( s3 = boto3.resource("s3")), bạn có thể truy cập ứng dụng khách và do đó là Ngoại lệ thông qua s3.meta.client.exceptions.NoSuchKey. Xem stackoverflow.com/questions/38581465/…
lorey

31

Trong boto3, tôi đã có thể truy cập ngoại lệ trong máy khách meta của tài nguyên.

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

24

Tôi nghĩ rằng cách tốt nhất để làm điều này là trong Boto3 là

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

Tài liệu về xử lý lỗi có vẻ thưa thớt, nhưng tài liệu sau sẽ in ra mã lỗi mà tài liệu này hoạt động cho:

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)

Đối tượng <botocore.errorfactory.S3Exceptions tại 0x105e08c50> đối tượng không có thuộc tính 'InvalidBucketName'. Các ngoại lệ hợp lệ là: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


Vì những lý do có thể không liên quan, khi tôi bẫy Ngoại lệ theo cách này, chúng không truyền bá. (?)
Everett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.