On 07/24/2017 06:41 PM, Ben Finney wrote:
How can I stop Python from deleting a name binding, when that name is
used for binding the exception that is caught? When did this change in
behaviour come into Python?
I am writing code to run on both Python 2 and Python 3::
exc = None
try:
1/0
text_template = "All fine!"
except ZeroDivisionError as exc:
text_template = "Got exception: {exc.__class__.__name__}"
print(text_template.format(exc=exc))
Something like:
try:
....
except ZeroDivisionError as dead_exc:
exc = dead_exc
....
....
print(text_template.format(exc=exc)
Why is the ‘exc’ binding deleted from the outer scope?
Help prevent memory leaks and allow resources to be cleaned up sooner.
How are we meant
to reliably preserve the name binding to use it *after* the ‘except’
clause?
Reassign to something else, like my example above.
When did this change come into Python, where is it documented?
Documented at:
https://docs.python.org/3/reference/compound_stmts.html#the-try-statement [1]
Don't recall exactly when changed.
Would I be right to report this as a bug in Python 3?
No.
--
~Ethan~
[1] Thanks to https://stackoverflow.com/q/29268892/208880
--
https://mail.python.org/mailman/listinfo/python-list