Boto3,Python和如何处理错误

我刚刚拿起python作为我的前往脚本语言,我正试图找出如何做适当的error handling与boto3。

我正在尝试创build一个IAM用户:

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状态代码和新创build的用户的数据。

例:

 {'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.ClientErrortypes的对象只有文本告诉我什么地方出错了。

例如:ClientError('调用CreateUser操作时发生错误(EntityAlreadyExists):名称被忽略的用户已经存在',)

这个(AFAIK)使得error handling非常困难,因为我不能只打开生成的http状态代码(根据IAM的AWS API文档,用户已经存在了409个)。 这让我觉得我一定是在做错事。 最佳的方式是让boto3永远不会抛出exception,但juts总是返回一个反映API调用行为的对象。

任何人都可以在这个问题上启发我,或指出我在正确的方向吗?

非常感谢!

使用exception中包含的响应。 这里是一个例子:

 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'或'ValidationError'
  • ['ResponseMetadata']['HTTPStatusCode']例如400
  • ['ResponseMetadata']['RequestId']例如'd2b06652-88d7-11e5-99d0-812348583a35'
  • ['Error']['Message']例如“发生错误(EntityAlreadyExists)…”
  • ['Error']['Type']例如'Sender'

欲了解更多信息,请参阅botocoreerror handling 。

当它无法处理问题时,你需要做一些事情。 现在你正在返回实际的exception。 例如,如果它不是用户已经存在的问题,并且想要将其作为get_or_create函数使用,则可以通过返回现有的用户对象来处理该问题。

 try: user = iam_conn.create_user(UserName=username) return user except botocore.exceptions.ClientError as e: #this exception could actually be other things other than exists, so you want to evaluate it further in your real code. if e.message.startswith( 'enough of the exception message to identify it as the one you want') print('that user already exists.') user = iam_conn.get_user(UserName=username) return user elif e.message.some_other_condition: #something else else: #unhandled ClientError raise(e) except SomeOtherExceptionTypeYouCareAbout as e: #handle it # any unhandled exception will raise here at this point. # if you want a general handler except Exception as e: #handle it. 

也就是说,对于您的应用程序来说,这可能是一个问题,在这种情况下,您希望将exception处理程序放在调用create user函数的代码中,并让调用函数确定如何处理它,例如,通过询问用户input另一个用户名,或任何有意义的应用程序。