捕获 boto3 ClientError 子类

新手上路,请多包涵

使用类似下面代码片段的代码,我们可以捕获 AWS 异常:

 from aws_utils import make_session

session = make_session()
cf = session.resource("iam")
role = cf.Role("foo")
try:
    role.load()
except Exception as e:
    print(type(e))
    raise e

返回的错误类型为 botocore.errorfactory.NoSuchEntityException 。但是,当我尝试导入此异常时,我得到以下信息:

 >>> import botocore.errorfactory.NoSuchEntityException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named NoSuchEntityException

我能找到的捕获此特定错误的最佳方法是:

 from botocore.exceptions import ClientError
session = make_session()
cf = session.resource("iam")
role = cf.Role("foo")
try:
    role.load()
except ClientError as e:
    if e.response["Error"]["Code"] == "NoSuchEntity":
        # ignore the target exception
        pass
    else:
        # this is not the exception we are looking for
        raise e

但这似乎很“hackish”。有没有办法在 boto3 中直接导入和捕获 ClientError 的特定子类?

编辑:请注意,如果您以第二种方式捕获错误并打印类型,它将是 ClientError

原文由 Daniel Kats 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 752
2 个回答

如果您使用的是 客户端,则可以像这样捕获异常:

 import boto3

def exists(role_name):
    client = boto3.client('iam')
    try:
        client.get_role(RoleName='foo')
        return True
    except client.exceptions.NoSuchEntityException:
        return False

原文由 Mads Hartmann 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您正在使用该 资源,您可以像这样捕获异常:

 cf = session.resource("iam")
role = cf.Role("foo")
try:
    role.load()
except cf.meta.client.exceptions.NoSuchEntityException:
    # ignore the target exception
    pass

这结合了较早的答案和使用 .meta.client 的简单技巧,从较高级别的资源到较低级别的客户端(来源: https ://boto3.amazonaws.com/v1/documentation/api /latest/guide/clients.html#creating-clients )。

原文由 MarnixKlooster ReinstateMonica 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题