以下のスニペットのようなコードを使用すると、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
になることに注意してください。
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
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
これは私のために働いた