Avec du code comme l'extrait ci-dessous, nous pouvons intercepter les exceptions 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
L'erreur retournée est de type botocore.errorfactory.NoSuchEntityException
. Cependant, lorsque j'essaie d'importer cette exception, j'obtiens ceci:
>>> import botocore.errorfactory.NoSuchEntityException
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named NoSuchEntityException
La meilleure méthode que j'ai pu trouver pour détecter cette erreur spécifique est:
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
Mais cela semble très "hackish". Existe-t-il un moyen d'importer directement et d'attraper des sous-classes spécifiques de ClientError
dans boto3?
EDIT: notez que si vous détectez des erreurs de la deuxième manière et imprimez le type, ce sera ClientError
.
Si vous utilisez client vous pouvez intercepter les exceptions comme ceci:
import boto3
def exists(role_name):
client = boto3.client('iam')
try:
client.get_role(RoleName='foo')
return True
except client.exceptions.NoSuchEntityException:
return False
Si vous utilisez ressource vous pouvez intercepter les exceptions comme ceci:
cf = session.resource("iam")
role = cf.Role("foo")
try:
role.load()
except cf.meta.client.exceptions.NoSuchEntityException:
# ignore the target exception
pass
Cela combine la réponse précédente avec l'astuce simple d'utiliser .meta.client
pour passer de la ressource de niveau supérieur au client de niveau inférieur.
try: something except client.exceptions.NoSuchEntityException: something
Cela a fonctionné pour moi