बोटोकोर के NoSuchKey अपवाद पर कब्जा कैसे करें?


102

मैं "अच्छा" अजगर लिखने की कोशिश कर रहा हूं और 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 *या तो काम नहीं करता है और मैं एक सामान्य त्रुटि पर कब्जा नहीं करना चाहता।

जवाबों:


123
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

बोटोकोर 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
सिल्वेस्टर कार्देजियोनेक 17

यदि आप मेरी तरह स्क्रॉल करना भूल गए हैं: यदि आप उच्च-स्तरीय संसाधन ( s3 = boto3.resource("s3")) का उपयोग कर रहे हैं , तो आप क्लाइंट तक पहुँच प्राप्त कर सकते हैं और इस प्रकार के माध्यम से अपवाद s3.meta.client.exceptions.NoSuchKey। देखें stackoverflow.com/questions/38581465/...
Lorey

31

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

24

मुझे लगता है कि ऐसा करने का सबसे सुरुचिपूर्ण तरीका बोतो 3 है

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.S3Exception ऑब्जेक्ट 0x105e08c50> ऑब्जेक्ट में कोई विशेषता नहीं है 'InvalidBucketName'। मान्य अपवाद हैं: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierrrror, ObjectNotInActiveTierError


उन कारणों के लिए जो असंबंधित हो सकते हैं, जब मैं अपवादों को इस तरह से फंसाता हूं, तो वे प्रचार नहीं करते हैं। (?)
एवरेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.