msg
in the except clause is in the same scope as msg
on the first line.
But in Python 3 we have this new behavior too:
When an exception has been assigned using as target
, it is cleared at
the end of the except clause. This is as if
except E as N:
foo
was translated to
except E as N:
try:
foo
finally:
del N
This means the exception must be assigned to a different name to be
able to refer to it after the except clause. Exceptions are cleared
because with the traceback attached to them, they form a reference
cycle with the stack frame, keeping all locals in that frame alive
until the next garbage collection occurs.
so, you "overwrite msg
" in the exception handler, and exiting the handler will delete the variable to clear the traceback reference cycle.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…