Portée des exceptions et attribution d'exceptions liées en Python
En Python, il est essentiel de comprendre la portée des exceptions nommées une fois le bloc except terminé. Cela devient évident lorsque l'on compare le comportement de Python 2.x et 3.x.
Comportement de Python 3.x : NameError et UnboundLocalError
Dans Python 3.x, tenter de accéder à une exception nommée dans un bloc except en dehors de ce bloc entraîne soit une NameError (en cas d'accès en dehors d'une fonction), soit un UnboundLocalError (en cas d'accès à l'intérieur d'une fonction).
Raison du changement
Ce changement est dû à la décision de Python 3.x de limiter explicitement la portée des exceptions nommées dans la clause except. Ceci permet d'éviter les références circulaires et d'éviter d'avoir à nettoyer explicitement les traces.
Solution de contournement
Pour accéder à une exception en dehors du bloc except, il est nécessaire de la relier à un nouveau nom. Par exemple :
<code class="python">exc = None try: raise Exception except Exception as exc: exc = exc # Rebinding to a new name</code>
Effacement explicite du traçage
Si vous le souhaitez, il est possible d'effacer le traçage explicitement après avoir lié à nouveau l'exception :
<code class="python">exc = None try: raise Exception("foo") except Exception as e: exc = e exc.__traceback__ = None</code>
Contraste avec Python 2.x
Dans Python 2.x, les exceptions ne contenaient pas de références à leur traçage, cette limitation de portée n'était donc pas nécessaire. Par conséquent, attribuer l’exception à une variable après le bloc except n’a eu aucune conséquence négative.
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!