จะจับข้อยกเว้น NoSuchKey ของ botocore ได้อย่างไร?


109

ฉันพยายามเขียน python "ดี" และจับ S3 โดยไม่มีข้อผิดพลาดของคีย์ดังกล่าว:

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"

แต่ NoSuchKey ไม่ได้กำหนดไว้และฉันไม่สามารถติดตามมันไปยังการนำเข้าที่ฉันจำเป็นต้องกำหนดไว้

e.__class__เป็นbotocore.errorfactory.NoSuchKeyแต่from botocore.errorfactory import NoSuchKeyให้ข้อผิดพลาดและfrom botocore.errorfactory import *ไม่ทำงานเช่นกันและฉันไม่ต้องการจับข้อผิดพลาดทั่วไป

คำตอบ:


134
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

การใช้ botocore 1.5 ดูเหมือนว่าตัวจัดการไคลเอ็นต์จะแสดงคลาสข้อยกเว้น:

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"

ฉันเลือกใช้อันนี้เนื่องจากใหม่กว่าและยังไม่ค่อยมีทั่วไป คุณสามารถดูความคิดเห็นบางอย่างใน GitHub เกี่ยวกับวิธีนี้: github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester Kardziejonek

2
หากคุณลืมที่จะเลื่อนเหมือนผม: หากคุณกำลังใช้ทรัพยากรระดับสูง ( s3 = boto3.resource("s3")) s3.meta.client.exceptions.NoSuchKeyคุณสามารถเข้าถึงลูกค้าและทำให้ข้อยกเว้นผ่าน ดูstackoverflow.com/questions/38581465/…
lorey

34

ใน boto3 ฉันสามารถเข้าถึงข้อยกเว้นในเมตาไคลเอนต์ของทรัพยากรได้

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

การใช้ข้อมูลเมตาอยู่ในความคิดของฉันเป็นวิธีที่สง่างามที่สุด
Tanja Bayer

24

ฉันคิดว่าวิธีที่สง่างามที่สุดใน 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")

เอกสารเกี่ยวกับการจัดการข้อผิดพลาดดูเหมือนกระจัดกระจาย แต่ต่อไปนี้จะพิมพ์รหัสข้อผิดพลาดที่ใช้ได้กับ

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 ที่ 0x105e08c50> อ็อบเจ็กต์ไม่มีแอตทริบิวต์ "InvalidBucketName" ข้อยกเว้นที่ถูกต้อง ได้แก่ BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


ด้วยเหตุผลที่อาจไม่เกี่ยวข้องเมื่อฉันดักจับข้อยกเว้นด้วยวิธีนี้พวกเขาจะไม่เผยแพร่ (?)
Everett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.