A Byte of Python

Try..Finally

I si estem llegint un fitxer i volem tancar-lo tant si s'ha produït una excepció com si no? En aquests casos podem fer servir el bloc finally. Notem que podem fer servir la clàusula except amb finally dins el mateix bloc try incloent un dins de l'altre.

Ús de Finally

Example 13.3. Ús de Finally

				
#!/usr/bin/python
# Filename: finally.py

import time

try:
	f = file('poem.txt')
	while True: # la nostra manera habitual de llegir un fitxer
		line = f.readline()
		if len(line) == 0:
			break
		time.sleep(2)
		print line,
finally:
	f.close()
	print 'Cleaning up...closed the file'
				
				

Sortida

				
$ python finally.py
Programming is fun
When the work is done
Cleaning up...closed the file
Traceback (most recent call last):
  File "finally.py", line 12, in ?
    time.sleep(2)
KeyboardInterrupt
				
				

Com funciona

Llegim el fitxer de la manera habitual, però he introduït arbitràriament un temps d'espera de 2 segons abans d'escriure cada línia amb el mètode time.sleep. La idea és que el programa s'executi prou lentament (Python és naturalment molt ràpid). Mentre el programa està encara funcionant, premem Ctrl-c per a interrompre l'execució.

Observem que es llença una excepció KeyboardInterrupt i que el programa surt. Però, abans de sortir, s'executa la clàusula finally que tanca el fitxer.