web-dev-qa-db-ja.com

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

しかし、これは非常に「ハッキング」のようです。 boto3でClientErrorの特定のサブクラスを直接インポートしてキャッチする方法はありますか?

編集:2番目の方法でエラーをキャッチしてタイプを出力すると、それはClientErrorになることに注意してください。

18
Daniel Kats

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
24
Mads Hartmann

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を使用して上位レベルのリソースから下位レベルのクライアントに取得するという単純なトリックを組み合わせたものです。

  try:
      something 
 except client.exceptions.NoSuchEntityException:
      something

これは私のために働いた

1