font - subplot title python
el regreso come la excepción (4)
La excepción desaparece cuando utilizas
return
dentro de una cláusulafinally
. .. ¿Está documentado en alguna parte?
Si finalmente está presente, especifica un controlador de ''limpieza''. La cláusula try se ejecuta, incluidas las cláusulas except y else. Si se produce una excepción en cualquiera de las cláusulas y no se maneja, la excepción se guarda temporalmente. La cláusula finally se ejecuta. Si hay una excepción guardada, se vuelve a subir al final de la cláusula finally. Si la cláusula finally genera otra excepción o ejecuta una declaración de devolución o interrupción, la excepción guardada se pierde.
Encontré el siguiente comportamiento al menos extraño :
def errors():
try:
ErrorErrorError
finally:
return 10
print errors()
# prints: 10
# It should raise: NameError: name ''ErrorErrorError'' is not defined
La excepción desaparece cuando utilizas return
dentro de una cláusula finally
. ¿Es eso un error? ¿Eso está documentado en alguna parte?
Pero la verdadera pregunta (y la respuesta que marcaré como correcta) es:
¿Cuál es el motivo de los desarrolladores de Python para permitir ese comportamiento extraño?
Aquí hay una comparación interesante para return in finally block, entre - Java / C # / Python / JavaScript: http://www.gettingclever.com/2008/07/return-from-finally.html
Preguntaste sobre el razonamiento de los desarrolladores de Python. No puedo hablar por ellos, pero ningún otro comportamiento tiene sentido. Una función puede devolver un valor o puede generar una excepción; no puede hacer ambas cosas El propósito de una cláusula "por fin" es proporcionar código de limpieza que esté "garantizado" para ejecutarse, independientemente de las excepciones. Al colocar una declaración de devolución en una cláusula finally, ha declarado que desea devolver un valor, sin importar qué, independientemente de las excepciones. Si Python se comportó como lo hace y planteó la excepción, estaría rompiendo el contrato de la cláusula "finally" (porque no devolvería el valor que le indicó que devuelva).
Regresar de un final no es una buena idea. Sé que C # específicamente prohíbe hacer esto.