Maison >développement back-end >Tutoriel Python >En quoi la portée des exceptions nommées diffère-t-elle entre Python 2.x et 3.x ?

En quoi la portée des exceptions nommées diffère-t-elle entre Python 2.x et 3.x ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-29 18:34:54532parcourir

How does the scope of named exceptions differ between Python 2.x and 3.x?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn