python - Boto3, पायथन और त्रुटियों को कैसे संभालें




2 Answers

अपवाद के भीतर निहित प्रतिक्रिया का प्रयोग करें। यहाँ एक उदाहरण है:

import boto3
from botocore.exceptions import ClientError

try:
    iam = boto3.client('iam')
    user = iam.create_user(UserName='fred')
    print "Created user: %s" % user
except ClientError as e:
    if e.response['Error']['Code'] == 'EntityAlreadyExists':
        print "User already exists"
    else:
        print "Unexpected error: %s" % e

अपवाद में प्रतिक्रिया निर्देश में निम्न शामिल होंगे:

  • ['Error']['Code'] जैसे 'EntityAlreadyExists' या 'प्रमाणीकरण ['Error']['Code'] '
  • ['ResponseMetadata']['HTTPStatusCode'] उदाहरण के लिए 400
  • ['ResponseMetadata']['RequestId'] जैसे 'd2b06652-88d7-11e5-99d0-812348583a35'
  • ['Error']['Message'] उदाहरण के लिए "एक त्रुटि हुई (EntityAlreadyExists) ..."
  • ['Error']['Type'] जैसे 'प्रेषक'

अधिक जानकारी के लिए botocore.readthedocs.io/en/latest/… देखें।

[अपडेटेडः 2018-03-07]

एडब्ल्यूएस पायथन एसडीके ने clients पर सेवा अपवादों का खुलासा करना शुरू कर दिया clients (हालांकि resources पर नहीं) जिन्हें आप स्पष्ट रूप से पकड़ सकते हैं, इसलिए अब इस कोड को कुछ लिखना संभव है:

import boto3
from botocore.exceptions import ClientError, ParamValidationError

try:
    iam = boto3.client('iam')
    user = iam.create_user(UserName='fred')
    print "Created user: %s" % user
except iam.exceptions.EntityAlreadyExistsException:
    print "User already exists"
except ParamValidationError as e:
    print "Parameter validation error: %s" % e
except ClientError as e:
    print "Unexpected error: %s" % e

दुर्भाग्यवश, वर्तमान में इन अपवादों के लिए कोई दस्तावेज़ीकरण नहीं है।

मैंने अभी अपनी स्क्रिप्टिंग भाषा के रूप में पायथन उठाया है और मैं यह समझने की कोशिश कर रहा हूं कि boto3 के साथ उचित त्रुटि कैसे करें।

मैं एक आईएएम उपयोगकर्ता बनाने की कोशिश कर रहा हूं:

def create_user(username, iam_conn):
    try:
        user = iam_conn.create_user(UserName=username)
        return user
    except Exception as e:
        return e

जब create_user को कॉल सफल होता है, तो मुझे एक साफ ऑब्जेक्ट मिलता है जिसमें API कॉल का http स्थिति कोड और नव निर्मित उपयोगकर्ता का डेटा होता है।

उदाहरण:

{'ResponseMetadata': 
      {'HTTPStatusCode': 200, 
       'RequestId': 'omitted'
      },
 u'User': {u'Arn': 'arn:aws:iam::omitted:user/omitted',
           u'CreateDate': datetime.datetime(2015, 10, 11, 17, 13, 5, 882000, tzinfo=tzutc()),
           u'Path': '/',
           u'UserId': 'omitted',
           u'UserName': 'omitted'
          }
}

यह बहुत अच्छा काम करता है। लेकिन जब यह विफल हो जाता है (जैसे कि उपयोगकर्ता पहले से मौजूद है), तो मुझे बस botocore.exceptions.bientError का एक ऑब्जेक्ट मिलता है जो मुझे बताता है कि क्या गलत हुआ।

उदाहरण: क्लाइंट एरर ('एक त्रुटि हुई (EntityAlreadyExists) CreateUser ऑपरेशन को कॉल करते समय: छोड़ा गया नाम वाला उपयोगकर्ता पहले से मौजूद है।',)

यह (AFAIK) त्रुटि को बहुत कठिन बनाता है क्योंकि मैं केवल परिणामी http स्थिति कोड पर स्विच नहीं कर सकता (उपयोगकर्ता के लिए 40 9 आईएएम के लिए एडब्ल्यूएस एपीआई दस्तावेज़ों के अनुसार पहले से मौजूद है)। इससे मुझे लगता है कि मुझे कुछ गलत तरीके से करना होगा। इष्टतम तरीका boto3 के लिए कभी अपवाद नहीं फेंकने के लिए होगा, लेकिन juts हमेशा एक ऑब्जेक्ट लौटाता है जो दर्शाता है कि एपीआई कॉल कैसे चला गया।

क्या कोई मुझे इस मुद्दे पर उजागर कर सकता है या मुझे सही दिशा में इंगित कर सकता है?

आपका बहुत बहुत धन्यवाद!




या वर्ग नाम जैसे तुलना

except ClientError as e:
    if 'EntityAlreadyExistsException' == e.__class__.__name__:
        # handle specific error

क्योंकि वे गतिशील रूप से बनाए गए हैं, आप कक्षा को कभी भी आयात नहीं कर सकते हैं और वास्तविक पायथन का उपयोग करके इसे पकड़ सकते हैं।




Related

python amazon-web-services boto boto3