小编典典

如何处理boto3的错误?

all

我试图弄清楚如何使用 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 调用方式的对象。

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


阅读 69

收藏
2022-05-10

共1个答案

小编典典

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

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
开发工具包已开始在客户端(尽管不是在资源上)公开您可以显式捕获的服务异常,因此现在可以像这样编写该代码:

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 中的。

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

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

[更新时间:2021-09-07]

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

2022-05-10