web-dev-qa-db-fra.com

Attraper la sous-classe boto3 ClientError

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.

18
Daniel Kats

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

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

1
Ranjeet Golkonda