Il ne s'agit pas d'un duplicata des divers documents de l'UE. pourquoi une exception est finalement supprimée questions.
Au lieu de cela, je trouve que finally
Les variables locales de l'utilisateur sont inattendues, mais seulement dans le cas d'une exception. Dans ce cas, l'exception disparaît.
(Ceci est sous Python 3.8)
def test(divisor):
print(f"\n\ntest({divisor=})")
exc = None # always assigned!
foo = 1
print(f" ante.{exc=}")
try:
_ = 1 / divisor
print(f" post.{exc=}")
except (Exception,) as exc:
print(f" except.{exc=}")
else:
print(f" else.{exc=}")
finally:
print(f" finally:{locals()=}")
#at this point, it should be either None
#whatever was caught in the except clause
print(f" finally.{exc=}")
test(1)
test(0)
Sortie en cas de succès - comme prévu :
test(divisor=1)
ante.exc=None
post.exc=None
else.exc=None
finally:locals()={'divisor': 1, 'exc': None, 'foo': 1, '_': 1.0}
finally.exc=None
Sur une exception - UnboundLocalError
Il semble que l'espace de nom local ait exc
supprimé et cela provoque une erreur UnboundLocalError.
Je m'attendrais à ce qu'il y ait une ZeroDivisionError. Tout au plus, si except
définissait une portée locale pour une raison quelconque, il pourrait toujours être None
. Mais c'est parti.
comme si del locals()["exc"]
avait eu lieu.
test(divisor=0)
ante.exc=None
except.exc=ZeroDivisionError('division by zero')
finally:locals()={'divisor': 0, 'foo': 1}
Traceback (most recent call last):
File "test_195_finally.py:27", in <module>
test(0)
File "test_195_finally.py:23", in test
print(f" finally.{exc=}")
UnboundLocalError: local variable 'exc' referenced before assignment
Reliure exc
à une autre variable montre que cette autre variable est bien vivante.
except (Exception,) as exc:
exc2=exc
finally:locals()={'divisor': 0, 'foo': 1, 'exc2': ZeroDivisionError('division by zero')}