19 votes

Réassigner une exception à l'intérieur d'un bloc python __exit__

De l'intérieur d'un __exit__ dans une classe de curseur personnalisée, je veux attraper une exception pour pouvoir à mon tour lancer une exception plus spécifique. Quelle est la bonne façon de procéder ?

class Cursor:
    def __enter__(self):
        ...

    def __exit__(self, ex_type, ex_val, tb):
        if ex_type == VagueThirdPartyError:
            # get new more specific error based on error code in ex_val and
            # return that one in its place.
            return False # ?
        else:
            return False

Lever l'exception spécifique dans le cadre de la __exit__ Le bloc semble être un hack, mais peut-être que j'y pense trop.

30voto

Martijn Pieters Points 271458

La procédure correcte consiste à soulever la nouvelle exception à l'intérieur de l'élément __exit__ gestionnaire.

Vous devez no soulève l'exception qui lui a été transmise ; pour permettre l'enchaînement des gestionnaires de contexte, il suffit dans ce cas de renvoyer une valeur erronée à partir du gestionnaire. Lever ses propres exceptions est cependant tout à fait possible.

Notez qu'il est préférable d'utiliser le test d'identité is pour vérifier le type de l'exception transmise :

def __exit__(self, ex_type, ex_val, tb):
    if ex_type is VagueThirdPartyError:
        if ex_val.args[0] == 'foobar':
            raise SpecificException('Foobarred!')

        # Not raising a new exception, but surpressing the current one:
        if ex_val.args[0] == 'eggs-and-ham':
            # ignore this exception
            return True

        if ex_val.args[0] == 'baz':
            # re-raise this exception
            return False

    # No else required, the function exits and `None` is  returned

Vous pouvez également utiliser issubclass(ex_type, VagueThirdPartyError) pour permettre la création de sous-classes de l'exception en question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X