Como se explica en la documentation, la cláusula finally
pretende definir acciones de limpieza que deben ser ejecutadas en todas las circunstancias.
Si finally
está presente, especifica un controlador de "limpieza". Se ejecuta la cláusula try
, 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. Se ejecuta la cláusula finally
. Si hay una excepción guardada, se vuelve a generar al final de la finally
cláusula.
Un ejemplo:
>>> def divide(x, y):
... try:
... result = x/y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
Como se puede ver, la cláusula finally
se ejecuta en cualquier caso. El TypeError
generado al dividir dos cadenas no se trata mediante la cláusula except
y, por lo tanto, se vuelve a generar después de que se haya ejecutado la cláusula finally
.
En aplicaciones del mundo real, la cláusula finally es útil para liberar recursos externos (como archivos o conexiones de red), independientemente de si el uso del recurso fue exitoso.
intento: # x = Hola + 20 x = 10 + 20 excepto: de impresión 'Estoy en bloque, excepto' x = 20 + 30 otra cosa: de impresión 'Estoy en bloque else' x + = 1 finally: print 'Finalmente x =% s'% (x) –