Python ‘try… except Exception as…’ provoca un NameError para un nombre en el ámbito local.
Estoy completamente desconcertado por este, y no pude encontrar nada al respecto.
Quería capturar una excepción y luego hacer algo diferente si se hubiera producido una, así que escribí código como este:
x = 1
for i in range(5, -1, -1):
error = None
try:
x = x / i
except Exception as error:
print(error)
if error is None:
print(f"x={x}: Sin problema")
El código anterior captura la excepción deliberada, pero luego genera un NameError
después:
x=0.2: Sin problema
x=0.05: Sin problema
x=0.016666666666666666: Sin problema
x=0.008333333333333333: Sin problema
x=0.008333333333333333: Sin problema
float division by zero
Traceback (most recent call last):
File "/home/pi/code/temp-control/test.py", line 8, in <module>
if error is None:
NameError: el nombre 'error' no está definido
Puedo evitar el problema no usando el mismo nombre para la variable usada para capturar la excepción y la variable para marcar que ocurrió un error:
x = 1
for i in range(5, -1, -1):
error = None
try:
x = x / i
except Exception as err:
print(err)
error = True
if error is None:
print(f"x={x}: Sin problema")
Pero aún no entiendo cómo se produce el NameError
incluso en la primera versión. El nombre error
parece ser eliminado por la cláusula try .. except ..
.
davy.ai
En la primera versión del código, la variable
error
se usa para capturar la excepción y también para comprobar si se produjo algún error. Sin embargo, cuando se captura una excepción,error
se le asigna un valor (el objeto de excepción) y, por lo tanto, se define. Pero cuando no se captura ninguna excepción,error
permanece indefinido e intentar comprobar si esNone
genera unNameError
.Para evitar este problema, se recomienda utilizar un nombre de variable diferente para la bandera que indica si se produjo un error.