La posibilidad de obtener una excepción se elevó y luego se tragó porque Está utilizando un continue
es un argumento fuerte, pero la excepción también se traga cuando utiliza un break
o return
en su lugar.
Por ejemplo, esto funciona y la excepción se ingiere:
for i in range(10):
print i
try:
raise Exception
finally:
break
print i # not gonna happen
De nuevo, esto funciona sin error (cuando en una función) y la excepción es tragado demasiado:
for i in range(10):
print i
try:
raise Exception
finally:
return
print i # not gonna happen
Entonces, ¿por ¿Se permiten break
y return
en un bloque finally
, con o sin posibles errores elevados, pero continue
no?
También puede considerar la combinación de los siguientes factores en la edición:
finally
siempre se ejecuta;
continue
"cancela" la iteración actual.
Esto significa que dentro de cada bucle, debido a la ejecución de finally
siempre, siempre tendrá una bruja continue
básicamente dice "abortar iteración actual", "abortar iteración actual", "abortar iteración actual" .. . bruja realmente no tiene ningún sentido. Pero tampoco tiene sentido usar break
y return
. La iteración actual también se interrumpe con la única diferencia que ahora termina con una sola iteración.
Entonces la pregunta "¿Por qué continue
no está permitido en un finally
?" también se puede preguntar como "¿Por qué se permiten break
y return
?".
¿Quizás porque tenía sentido no hacerlo en ese momento? ¿Fue la decisión de los desarrolladores y ahora es como es? Claro, también podría ser la pereza del implementador, pero quién sabe, tal vez tenían algo en mente y quizás, en otra versión de Python, sería más sentido tenerlo de otra manera.
La idea es que los ejemplos aquí son simplemente extremos. No solo escribes código así, ¿verdad? Seguramente habrá un poco de lógica en el bloque finally
para decir cuándo break/return/continue
, lo que sea, y no solo que sea tan contundente. Como tal, se debe permitir IMHO continue
dentro de finally
porque agradecería escribir un código limpio usando continue
en finally
si eso es lo que necesito, en lugar de recurrir a una solución de código para esta limitación (es decir, en la filosofía de Python "Todos somos consentir adultos aquí ").
¿Parece pura vagancia? http://www.gossamer-threads.com/lists/python/dev/484210 –
@Mike Christensen: También encontré ese hilo, pero los documentos dicen "continuar solo puede ocurrir sintácticamente anidado en un bucle for o while, pero no anidado en una definición de función o clase ** o cláusula final dentro de ese bucle ** ". Entonces, ¿era esta pereza o era algo deliberado que más tarde necesitaba un cambio? ... como tantas cosas en Python ... – ElenaT
¿Leíste todo el hilo? - Hay información interesante acerca de lo que realmente significaría 'continuar' en un bloque final, y varios problemas que podrían surgir. Vale la pena leer. –