AnteriorPosterior

13 - Contacto con las excepciones

Por: Nacho Cabanes
Actualizado: 17-08-2020 11:37
Tiempo de lectura estimado: 7 min.

 

Versión en video (3:59 min):

Fund.Prog con Python 2020

13 - Contacto con las excepciones

Vamos a aprovechar que conocemos lo básico del manejo de ficheros de texto para introducir un concepto muy habitual en lenguajes modernos, que es el control de errores utilizando excepciones.

Para entender qué son las excepciones, vamos a partir del ejemplo que leía de fichero y hay que plantearnos qué ocurre si este fichero no existe.

Una alternativa habitual en un lenguaje más antiguo sería empezar a incrustar órdenes "if" entre medias: Intento abrir y entonces diría: si he podido abrir, leo; si he podido abrir, cierro... pero cuando había dos o tres o cuatro condiciones posibles de error, eso hacía que el programa cada vez estuviera más tabulado a la derecha y que resultara menos legible, con lo cual una alternativa más moderna es poner al principio toda la lógica del problema y después la lógica de control de errores. Y eso se hace dividiendo el programa en dos bloques: en el bloque "try" y en el bloque de intercepción de errores. El bloque es decir, "quiero que intentes..." dos puntos... esto...

try:

y le indicamos los pasos que queremos que intente.

try:
    fichero = open("ejemplo2.txt", "r")

Y luego, en caso de que haya algún problema, en caso de que haya lo que llamamos una "excepción", lo que haremos es mostrar un mensaje de aviso, "no se ha podido encontrar".

try:
    fichero = open("ejemplo2.txt", "r")
    lineas = fichero.readlines()
    fichero.close()

except:
    print("No se ha podido encontrar")

El mostrar líneas en este caso sólo lo podríamos hacer si hemos podido leer, con lo cual sería parte del bloque "try".

try:
    fichero = open("ejemplo2.txt", "r")
    lineas = fichero.readlines()
    fichero.close()

    print(lineas)

except:
    print("No se ha podido encontrar")

Y aun así, en cualquier caso, el programa finalmente terminará, con lo cual podríamos añadir aquí una última línea sin tabular, para que no sea parte del "try" ni del "except", que sea fin del programa.

try:
    fichero = open("ejemplo2.txt", "r")
    lineas = fichero.readlines()
    fichero.close()

    print(lineas)

except:
    print("No se ha podido encontrar")

print("Fin del programa")

De esta forma va a intentar abrir fichero, leer líneas y mostrarlas, y en caso de que haya una excepción, de que haya un error en tiempo de ejecución, va a saltar. Imaginemos que lo que ocurre es que no encuentra el fichero: Desde esta línea salta a ésta y no se procesa ni la lectura, ni el cierre, ni se intenta mostrar.

Vamos a probarlo: Vamos al menú RUN o pulsamos F5. Y nos dice "no se ha podido encontrar", "fin del programa".

No se ha podido encontrar
Fin del programa

Insisto en la idea importante: ha intentado abrirlo, como no ha podido, ha saltado al bloque "except" y ha escrito que no se ha podido encontrar, pero no ha llegado a intentar leer porque no ha podido abrirlo, no ha llegado a cerrar, no ha llegado a escribir las líneas.

En programas un poco más avanzados se podría indicar aquí el tipo de excepción que queramos controlar, porque puede haber varias distintas, pero de momento eso queda un poco por encima del nivel que pretendemos en este punto.

Sí me interesa comentar que, al igual que la orden "if", en la orden "try" se que puede añadir un "else", que es un "si todo ha ido bien, quiero que hagas esto". La idea está en que para, que el bloque "try" no quede demasiado grande, hay quien es partidario de decir: vamos a añadir un bloque "else" y las líneas que procesan el fichero las vamos a llevar al bloque "else". Así la lógica es un poco más evidente todavía:

try:
    fichero = open("ejemplo2.txt", "r")

except:
    print("No se ha podido encontrar")

else:
    lineas = fichero.readlines()
    fichero.close()    
    print(lineas)

print("Fin del programa")

Vamos a analizarlo... vamos a intentar abrir el fichero. Si hay errores, vamos a decir que no se ha podido encontrar, y si no hay errores, vamos a leer las líneas, cerrar fichero, mostrar las líneas. Vamos a ver primero que se comporta igual que antes.

Si el fichero de datos sí está disponible, tanto esta versión como la otra sí que serán capaces de leer los datos y de mostrarlos antes de escribir "fin de programa".

Ejercicio propuesto 13.1. Pide al usuario el nombre de un fichero. Si el fichero existe, muestra su contenido (pero no como lista, sino las líneas una a una) y si no existe, escribe un mensaje de error adecuado.

85 visitas desde el 15-08-2020

AnteriorPosterior