我试图弄清楚如何使用 boto3 进行正确的错误处理。
我正在尝试创建一个 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 状态代码和新创建的用户的数据。
例子:
{'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.ClientError 类型的对象,只有文本告诉我出了什么问题。
示例:ClientError(‘调用 CreateUser 操作时发生错误 (EntityAlreadyExists):省略名称的用户已存在。’,)
这(AFAIK)使错误处理变得非常困难,因为我不能只打开生成的 http 状态代码(根据 IAM 的 AWS API 文档,用户的 409 已经存在)。这让我觉得我一定是以错误的方式做事。最佳方式是让 boto3 从不抛出异常,但 juts 总是返回一个反映 API 调用方式的对象。
任何人都可以在这个问题上启发我或指出我正确的方向吗?
使用异常中包含的响应。这是一个例子:
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']
['ResponseMetadata']['HTTPStatusCode']
['ResponseMetadata']['RequestId']
['Error']['Message']
['Error']['Type']
有关更多信息,请参阅:
[更新时间:2018-03-07]
AWS Python 开发工具包已开始在客户端(尽管不是在资源上)公开您可以显式捕获的服务异常,因此现在可以像这样编写该代码:
import botocore import boto3 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 botocore.exceptions.ParamValidationError as e: print("Parameter validation error: %s" % e) except botocore.exceptions.ClientError as e: print("Unexpected error: %s" % e)
不幸的是,目前没有关于这些错误/异常的文档,但您可以获得核心错误列表,如下所示:
import botocore import boto3 [e for e in dir(botocore.exceptions) if e.endswith('Error')]
请注意,您必须同时导入 botocore 和 boto3。如果你只 import botocore 那么你会发现 botocore 没有名为 的属性exceptions。这是因为异常是由 boto3 动态填充到 botocore 中的。
exceptions
您可以获得如下服务特定异常的列表(iam根据需要替换为相关服务):
iam
import boto3 iam = boto3.client('iam') [e for e in dir(iam.exceptions) if e.endswith('Exception')]
[更新时间:2021-09-07]
除了前面提到的客户端异常方法外,还有一个名为aws-error-utils的第三方帮助程序包。