Accéder aux exceptions nommées au-delà des blocs except
Dans Python 3, tenter d'utiliser une exception nommée en dehors de son bloc except entraîne généralement une NameError ou UnboundLocalError. Contrairement à Python 2, les exceptions dans Python 3 font référence à leur trace, ce qui entraîne une limitation de portée dans la clause except.
Explication
L'instruction try restreint explicitement la portée de l’exception liée pour éviter les références circulaires et les fuites de mémoire potentielles. Lorsqu'une exception reçoit un nom en utilisant as, elle est effacée à la fin de la clause. Cela signifie que pour faire référence à l'exception par la suite, elle doit être liée à un nom différent.
Solutions de contournement
Puisque Python 3 clarifie la portée de l'exception, il existe deux principales approches pour accéder aux exceptions au-delà de leurs blocs except :
Liaison à un nouveau nom : Au lieu d'attribuer l'exception à la même variable, liez-la à un nouveau nom avant quitter la clause except :
<code class="python">try: raise Exception("Custom Error") except Exception as e: new_exc = e print(new_exc)</code>
Effacer le traçage : Si l'exception n'est pas nécessaire, son traçage peut être explicitement effacé pour éviter les fuites de mémoire :
<code class="python">try: raise Exception("Custom Error") except Exception as e: e.__traceback__ = None print(e)</code>
Contexte historique
Dans Python 2, les exceptions ne faisaient pas référence au traçage, ce qui rendait la limitation de portée inutile. En conséquence, ce comportement a changé dans Python 3 pour répondre aux fuites potentielles de ressources.
Attention
Lorsque vous associez des exceptions à un nouveau nom, il est crucial de se rappeler que le l'exception d'origine est effacée à la fin de la clause except. Réattribuer l'exception à elle-même (par exemple, exc = exc) ne créera pas de nouvelle liaison et entraînera une NameError.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!