gpt4 book ai didi

python - 如何处理boto3的错误?

转载 作者:IT老高 更新时间:2023-10-28 12:24:22 27 4
gpt4 key购买 nike

我试图弄清楚如何使用 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 总是返回一个反射(reflect) 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'] 例如“EntityAlreadyExists”或“ValidationError”
  • ['ResponseMetadata']['HTTPStatusCode'] 例如400
  • ['ResponseMetadata']['RequestId'] 例如'd2b06652-88d7-11e5-99d0-812348583a35'
  • ['Error']['Message'] 例如“发生错误(EntityAlreadyExists)...”
  • ['Error']['Type'] 例如“发件人”

欲了解更多信息,请参阅:

[更新日期:2018-03-07]

AWS Python SDK 已开始在 clients 上公开服务异常(虽然不在 resources 上),您可以显式捕获,因此现在可以像这样编写该代码:

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。如果你只导入 botocore,你会发现 botocore 没有名为 exceptions 的属性。这是因为异常是由 boto3 动态填充到 botocore 中的。

您可以获得如下服务特定异常列表(根据需要将iam替换为相关服务):

import boto3
iam = boto3.client('iam')
[e for e in dir(iam.exceptions) if e.endswith('Exception')]

[更新日期:2021-09-07]

除了前面提到的客户端异常方法外,还有一个名为aws-error-utils的第三方帮助包.

关于python - 如何处理boto3的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com