es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 ...

Tags:  , ,

Answer

  1. Avatar for 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 es None genera un NameError.

    Para evitar este problema, se recomienda utilizar un nombre de variable diferente para la bandera que indica si se produjo un error.

Comments are closed.