Brett Cannon added the comment:

So the exception is explicitly deleted when the `except` block is exited to 
prevent leaking memory from the traceback attached to the exception. Hence 
there's an implicit `del e` at the end of the `except` block which is what 
you're running up against.

But I'm closing this as 'wont fix' because making this edge case work would be 
real troublesome and destroy performance whenever you bound the caught 
exception. Basically you would have to do the equivalent of:

e = 42
try:
  1/0
except ZeroDivisionError as _hidden_e:
  _overridden = False
  try:
    _old_e = e
    _overridden = True
  except NameError:
    pass
  e = _hidden_e
  # `except` block ...
  del e, _hidden_e
  if _hidden_flag:
    e = _old_e

That's a lot of code to run on every `except` clause that just happens to 
shadow a previously existing variable name. Because we try and not make 
exceptions too expensive in order to make them usable for occasional control 
flow, I don't think we can afford to add all of this for this edge case.

----------
nosy: +brett.cannon
resolution:  -> wont fix
stage:  -> resolved
status: open -> closed

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue26174>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to