- Se podía usar una sentencia finally para garantizar que un determinado código se ejecutaba en cualquier circustancia (Por ejemplo, para asegurarse de que un fichero abierto se cierra a pesar de cualquier error en el código)
- O bien se podián usar una o más sentencias except para atrapar excepciones específicas.
No se podían combinar los dos usos, es decir, no se podían usar simultaneamente sentencias except con una finally, porque la generación de código correcto para esta combinación era muy complicada, y no estaba claro el significado exacto que debía tener la combinación.
Nuestro Benevolente Dictador Vitalicio, Guido van Rossum, invirtió parte de su tiempo en trabajar con Java, que sí soportaba el equivalente de una combinación de excepts y finally en un único bloque, y esto aclaró la cuestión de cual debía ser el significado de la sentencia. En Python 2.5 se puede escribir ahora:
try:
block-1 ...
except Exception1:
handler-1 ...
except Exception2:
handler-2 ...
else:
else-block
finally:
final-block
El significado es este: Se ejecuta el código en el bloque block-1. Si se produce algúna excepción durante su ejecución, se recorren las diferentes bloques de excepts, buscando alguno que case con la excepción producida. Por ejemplo, si se produce una excepción del tipo Exception2, se ejecutará el código del bloque handler-2. Si no se ha producido ninguna excepción, se ejecutará tambien el código de la sentencia else —en nuestro caso else-block— si estuviera presente.
Sea cual sea el resultado hasta ahora, el código en la sentencia final es ejecutado, una vez que todo el código anterior (incluyendo el código encargado de gestionar las excepciones producidas) haya sido ejecutado. Incluso en el caso de que hubiera un error en el manejador de la excepción o en el bloque else y se produzca una nueva excepción, el código en la sentencia final siempre se ejecutará.
Ver comentarios