Ámbito de la instancia de excepción capturada en Python 2 y 3

Ya que en Python las variables son accesibles desde fuera de sus bucles e try , except bloques, pensé ingenuamente que este fragmento de código a continuación funcionaría bien porque e sería accesible:

 try: int('s') except ValueError as e: pass print(e) 

En Python 2 (2.7 probado), funciona como esperaba y la salida es:

 invalid literal for int() with base 10: 's' 

Sin embargo, en Python 3 me sorprendió que la salida fuera:

 NameError: name 'e' is not defined 

¿Por qué es esto?

Más tarde encontré una respuesta, ya que PEP 3110 explica que en Python 3 el nombre capturado se elimina al final de la suite except para permitir una recolección de basura más eficiente. También hay una syntax recomendada si desea evitar que esto ocurra:

Las situaciones en las que es necesario mantener una instancia de excepción más allá del final de la suite de excepción se pueden traducir fácilmente como tal

 try: ... except E as N: ... ... 

se convierte en

 try: ... except E as N: n = N ... … 

De esta manera, cuando se elimina N al final del bloque, n persistirá y se puede usar como normal.