web-dev-qa-db-fra.com

Attraper correctement les erreurs de boto3

Je développe une application Django qui communique avec plusieurs services Web Amazon.

Jusqu'à présent, j'ai du mal à gérer les exceptions lancées par le client boto3 et à intercepter les exceptions. Ce que je fais semble inutilement fastidieux:

Exemple:

client = boto3.client('sns')
client.create_platform_endpoint(PlatformApplicationArn=SNS_APP_ARN, Token=token)

cela pourrait générer un botocore.errorfactory.InvalidParameterException si, par exemple, le jeton est mauvais.

client.get_endpoint_attributes(EndpointArn=endpoint_arn)

pourrait jeter un botocore.errorfactory.NotFoundException.

Premièrement, je ne trouve ces erreurs nulle part dans le code, elles sont donc probablement générées quelque part. Bottom line: Je ne peux pas l'importer et l'attraper comme d'habitude.

Deuxièmement, j'ai trouvé un moyen de détecter l'erreur ici en utilisant:

try:
    # boto3 stuff
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == 'NotFound':
        # handle exception
    else:
        raise e

Mais je dois supprimer la partie Exception du nom de l'erreur. Cela semble très aléatoire et je ne sais pas si je supprimerais la Error dans botocore.exceptions.ParamValidationError si je voulais intercepter celle-ci. Il est donc difficile de généraliser.

Une autre façon de détecter l'erreur consiste à utiliser l'objet client boto3 que j'ai obtenu:

try:
    # boto3 stuff
except client.exceptions.NotFoundException as e:
    # handle exception

Cela semble le moyen le plus propre à ce jour. Mais je n'ai pas toujours l'objet client boto3 sous la main où je veux détecter l'erreur. De plus, je suis encore en train d’essayer des choses, donc c’est surtout du travail.

Est-ce que quelqu'un sait comment les erreurs de boto3 sont censées être traitées?

Ou peut me diriger vers une documentation cohérente qui mentionne les erreurs ci-dessus? Merci

8
David Nathan

Vous avez bien résumé la situation. L'ancienne boto avait une approche simple en code dur pour prendre en charge les API AWS. boto3, dans ce qui semble être une tentative visant à réduire les frais généraux liés à la synchronisation du client Python avec les fonctionnalités en évolution sur les divers API, a été plus clair autour des exceptions, de sorte que l'approche ClientError que vous avez décrite ci-dessus était canonique.

En 2017, ils ont introduit le deuxième mécanisme que vous avez souligné: les exceptions «modélisées» disponibles sur le client.

Je ne connais pas SNS, mais d'après mon expérience avec d'autres produits AWS, l'attribution de nom ClientError correspond à l'apis HTTP, qui a tendance à être bien documenté. Je commencerais donc ici: https://docs.aws.Amazon.com/sns/latest/api/Welcome.html

Il semble que les exceptions modélisées de style nouveau soient générées à partir de fichiers de définition de service hébergés dans le module botocore. Je ne trouve aucune documentation à ce sujet, mais parcourez les modèles de service AWS dans https://github.com/boto/botocore/tree/master/botocore/data .

De plus, il est bon de savoir que, si vous ne traitez pas directement avec le client de bas niveau, mais utilisez plutôt un objet AWS ServiceResource de haut niveau, un client de bas niveau est toujours facilement disponible à my_service_resource.meta.client. afin que vous puissiez gérer les exceptions comme ceci:

try:
    my_service_resource.do_stuff()
except my_service_resource.meta.client.exceptions.NotFoundException as e:
    # handle exception
3
ben author