2017-04-11 8 views
6

をboto3キャッチする、私たちは、AWSの例外をキャッチすることができます:ClientErrorサブクラス以下のスニペットのようなコードで

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という特定のサブクラスを直接インポートして捕捉する方法はありますか?

EDIT:2番目の方法でエラーを検出し、そのタイプを印刷すると、ClientErrorになることに注意してください。あなたはclientあなたはこのような例外をキャッチすることができます使用している場合

答えて

7

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

このコンバイン:あなたはresourceあなたはこのような例外をキャッチすることができます使用している場合

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

以前の答えは、より高いレベルのリソースからより低いレベルのクライアントに到達するために.meta.clientを使用する単純なトリックで答えました。

関連する問題