捕获boto3 ClientError子类

时间:2017-04-11 18:53:22

标签: python amazon-web-services boto3

使用下面的代码段代码,我们可以捕获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

3 个答案:

答案 0 :(得分:17)

如果你正在使用client,你可以捕获这样的例外:

import boto3

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

答案 1 :(得分:7)

如果你正在使用resource,你可以捕获这样的例外:

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

这将早期的答案与使用.meta.client从较高级别资源获取到较低级别客户端的简单技巧相结合。

答案 2 :(得分:1)

  try:
      something 
 except client.exceptions.NoSuchEntityException:
      something

这对我有用