Comment ajouter des exceptions du SDK Azure Python pour essayer / exclure des instructions?

Oct 31 2020

Je suis nouveau sur Python. J'ai un programme Python monolithique fonctionnel que je décompose en fonctions Python individuelles. Je voudrais utiliser le modèle try:- except:pour attraper des exceptions spécifiques pour chaque fonction.

Exemple: créer un client Key Vault et récupérer un secret depuis Key Vault

import logging
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credentials = DefaultAzureCredential()

def create_kv_client(kv_name, credentials):
    kv_uri = 'https://' + kv_name + '.vault.azure.net'
    kv_client = SecretClient(vault_url=kv_uri, credential=credentials)
    return kv_client

kv_client = create_kv_client('mykeyvaultname', credentials)

    
def retrieve_secret(table_stg_acct_key, kv_client):
    retrieved_account_key = kv_client.get_secret(table_stg_acct_key)
    return retrieved_account_key

try:
    retrieved_account_key = retrieve_secret('mykeyvaultsecretname', kv_client)
    print(retrieved_account_key)
except:
    logging.error('####### Failed to retrieve key from Key Vault #######')
    raise BaseException

Plutôt raise BaseExceptionqu'ici, j'aimerais utiliser le module d'exceptions Azure Core et consigner le message réel dans l'exception.

Comment la except:déclaration est-elle traitée dans le cas où deux exceptions pourraient être soulevées?

Exemple: il peut y avoir deux exceptions levées par la get_secretméthode.

  • Si l'URL de Key Vault est incorrecte, un ServiceRequestErrorest généré:
ServiceRequestError: <urllib3.connection.HTTPSConnection object at 0x000001BFA2299640>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed
  • Si le nom du secret Key Vault est incorrect, une ResourceNotFoundError est déclenchée:
ResourceNotFoundError: (SecretNotFound) A secret with (name/id) notmykeyvaultsecretname was not found in this key vault. If you recently deleted this secret you may be able to recover it using the correct recovery command. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125182

Comment cela est-il accompli?

  • Dois-je importer le module d'exception Azure Core?
  • Un exemple de ce modèle serait très utile.

Réponses

2 LaurentMazuel Oct 31 2020 at 04:28

L'exception sera interceptée dans l'ordre des clauses "except", mais méfiez-vous de l'arborescence des sous-classes, car une exception attrapera également toutes les sous-classes. Par exemple, celui-ci conduit à un code inaccessible.

try:
     # do something
except BaseException:
     # do something with
except DerivedException:
     # assuming DerivedException is an extension of BaseException, you can't reach that code

Alors mettez-les d'abord dans les plus spécifiques.

Dans votre situation Azure, cela conduit à quelque chose comme:

from azure.core.exceptions import (
    ServiceRequestError,
    ResourceNotFoundError,
    AzureError
)

try:
    # do KV stuff
except ServiceRequestError:
    # Network error, I will let it raise to higher level
    raise
except ResourceNotFoundError:
    # Let's assume it's not big deal here, just let it go
    pass
except AzureError as e:
    # Will catch everything that is from Azure SDK, but not the two previous
    logger.critical("Azure SDK was not able to deal with my query", e)
    raise
except Exception as e:
    # Anything else that is not Azure related (network, stdlib, etc.)
    logger.critical("Unknown error I can't blame Azure for", e)
    raise