/ / Python: Propage une exception via un bloc Try / Except avec plusieurs exceptions - python, exception, gestion des erreurs, gestion des exceptions

Python: Propage une exception via un bloc Try / Except avec plusieurs exceptions - python, exception, gestion des erreurs, gestion des exceptions

Existe-t-il un moyen de propager une exception dans un bloc try / except de l'un à l'autre?

Je veux attraper une erreur spécifique et ensuite faire une gestion d'erreur générale aussi.

"raise" laisse l'exception "bouger" vers un try / except extérieur, mais pas à l'intérieur du bloc try / except qui a généré l'erreur.

Ce devrait être idéalement quelque chose comme ceci:

import logging

def getList():
try:
newList = ["just", "some", "place", "holders"]
# Maybe from something like: newList = untrustedGetList()

# Faulty List now throws IndexError
someitem = newList[100]

return newList

except IndexError:
# For debugging purposes the content of newList should get logged.
logging.error("IndexError occured with newList containing: n%s",   str(newList))

except:
# General errors should be handled and include the IndexError as well!
logging.error("A general error occured, substituting newList with backup")
newList = ["We", "can", "work", "with", "this", "backup"]
return newList

Le problème que j'ai, c'est que lorsque IndexError est intercepté avec le premier sauf, la gestion de mes erreurs générales dans le deuxième bloc d'exception n'est pas appliquée.

La seule solution de rechange que j'ai pour l'instant est d'inclure également le code de traitement des erreurs général dans le premier bloc. Même si je l’enveloppe dans son propre bloc de fonctions, il semble encore moins élégant ...

Réponses:

3 pour la réponse № 1

Vous avez deux options:

  • Ne pas attraper IndexError avec un dédié except .. bloc. Vous pouvez toujours tester manuellement le type d’exception du bloc général en interceptant BaseException et attribuer l'exception à un nom (ici e):

    try:
    # ...
    except BaseException as e:
    if isinstance(e, IndexError):
    logging.error("IndexError occured with newList containing: n%s",   str(newList))
    
    logging.error("A general error occured, substituting newList with backup")
    newList = ["We", "can", "work", "with", "this", "backup"]
    return newList
    
  • Utiliser imbriqué try..except déclarations et re-augmenter:

    try:
    try:
    # ...
    except IndexError:
    logging.error("IndexError occured with newList containing: n%s",   str(newList))
    raise
    except:
    logging.error("A general error occured, substituting newList with backup")
    newList = ["We", "can", "work", "with", "this", "backup"]
    return newList