Excepciones#

Important

¿Qué aprenderemos?

Excepciones y errores

Como lo comentamos a inicio del curso hay varios tipos de errores, pero estos errores se engloban en dos grandes grupos:

  • Errorers sintácticos

  • Errores de excepción

En el caso del error sintáctico, Python intenta mostrar donde se encuentra esa falla sintáctica:

print('Hola Mundo)
  Input In [1]
    print('Hola Mundo)
                      ^
SyntaxError: EOL while scanning string literal

Observe la flecha mostrando que hace falta. Otro ejemplo es:

if 1==1:
print('hola')
  File "/tmp/ipykernel_25301/3980477174.py", line 2
    print('hola')
    ^
IndentationError: expected an indented block

En el casdo de excepciones nos referimos a errores que provienen de una sintáxis correcta pero el resultado en sí es un error. Generalmente, la última línea indica como fue ese error:

print(5/0)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/tmp/ipykernel_25301/1152173066.py in <module>
----> 1 print(5/0)

ZeroDivisionError: division by zero
print(x)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_25301/1353120783.py in <module>
----> 1 print(x)

NameError: name 'x' is not defined

Una lista de las excepciones incorpopradas en Python se puede encontrar aquí: https://docs.python.org/es/3/library/exceptions.html

Revisemos esa lista e identifiquemos algunas de las más comunes.

Nuestras propias excepciones#

Si en la mitad de nuestro algoritmo algo que no queremos que ocurra pasa, podemos plantear una excepción con raise, veamos:

Nota=2.5

if Nota <3:
    raise Exception('La nota debe ser mayor a 3.0 para los chicos pilos...')
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
/tmp/ipykernel_25301/3946800556.py in <module>
      2 
      3 if Nota <3:
----> 4     raise Exception('La nota debe ser mayor a 3.0 para los chicos pilos...')

Exception: La nota debe ser mayor a 3.0 para los chicos pilos...

Python detuvo la ejecución y mostró la (d)excepción por tener una nota menor a 3.

Los mensajes en pantalla también se puede mostrar para condiciones que se satisfacen. Usamos assert y verifica si las condiciones se cumplen:

Nota=3.5
assert (Nota > 3), "Falta Nota"

No paso nada porque cumplimos las condiciones, pero si:

Nota=2.5
assert (Nota > 3), "Falta Nota"
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
/tmp/ipykernel_25301/3656861006.py in <module>
      1 Nota=2.5
----> 2 assert (Nota > 3), "Falta Nota"

AssertionError: Falta Nota

Manejo de excepciones#

En python podemos usar el bloque try -> except que después de detectar una excepción sigue unas condiciones para realizar en vez de frenar el cálculo. Python ejecuta código siguiendo la declaración try y si encuentra un problema ejecutará las instruccione de except:

Lista=[3,0,5,6,0,1,2]
for i in Lista:
    try:
        print('El inverso de',i,'es',1/i)
    except:
        print('¡Uy! la lista tierne ceros')
El inverso de 3 es 0.3333333333333333
¡Uy! la lista tierne ceros
El inverso de 5 es 0.2
El inverso de 6 es 0.16666666666666666
¡Uy! la lista tierne ceros
El inverso de 1 es 1.0
El inverso de 2 es 0.5

Observe que sin el bloque try -> except tendriamos problemas en la ejecución del código:

Lista=[3,0,5,6,0,1,2]
for i in Lista:
    print('El inverso de',i,'es',1/i)
    
El inverso de 3 es 0.3333333333333333
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/tmp/ipykernel_25301/663013805.py in <module>
      1 Lista=[3,0,5,6,0,1,2]
      2 for i in Lista:
----> 3     print('El inverso de',i,'es',1/i)
      4 

ZeroDivisionError: division by zero

Pues al encontrar excepciones Python suspende la ejecución.

Clausula else#

En caso de no encontrar excepciones, podemos indicarle a Python que siga unas instrucciones usando else:

Veamos un ejemplo:

Lista=[3,0,5,6,0,1,2]
try:
    for i in Lista:
        print('El inverso de',i,'es',1/i)
except:
        print('¡Uy! la lista tierne ceros')
else:
        print('Este ejercicio se logró')
El inverso de 3 es 0.3333333333333333
¡Uy! la lista tierne ceros

Tenga cuidado porque aquí cambiamos el orden de los bloques según el ejemplo anterior. ¿Cómo cambió?

Lista=[3,5,6,1,2]
try:
    for i in Lista:
        print('El inverso de',i,'es',1/i)
except:
        print('¡Uy! la lista tierne ceros')
else:
        print('Este ejercicio se logró porque es una lista sincera')
El inverso de 3 es 0.3333333333333333
El inverso de 5 es 0.2
El inverso de 6 es 0.16666666666666666
El inverso de 1 es 1.0
El inverso de 2 es 0.5
Este ejercicio se logró porque es una lista sincera

Clausula finally#

Finalmente la clausula finally, el código en este bloque simempre se corre, con excepciones o no:

Veamos un ejemplo:

Lista=[3,5,6,1,2]
try:
    for i in Lista:
        print('El inverso de',i,'es',1/i)
except:
        print('¡Uy! la lista tierne ceros')
else:
        print('Este ejercicio se logró porque es una lista sincera')
finally:
    print('Este ejercicio terminó')
El inverso de 3 es 0.3333333333333333
El inverso de 5 es 0.2
El inverso de 6 es 0.16666666666666666
El inverso de 1 es 1.0
El inverso de 2 es 0.5
Este ejercicio se logró porque es una lista sincera
Este ejercicio terminó
Lista=[3,0,5,0,6,1,2]
try:
    for i in Lista:
        print('El inverso de',i,'es',1/i)
except:
        print('¡Uy! la lista tierne ceros')
else:
        print('Este ejercicio se logró porque es una lista sincera')
finally:
    print('Este ejercicio terminó')
El inverso de 3 es 0.3333333333333333
¡Uy! la lista tierne ceros
Este ejercicio terminó

Cierre#

Manejar excepciones resulta muy útil cuando no dependemos o no nos fiamos de los datos que utilizamos. Por ejemplo, si estamos leyendo páginmas en internet usando un raspador web, seguramente habrán momentos en que la conexión sufra, en este caso podemos establecer que hacer en ese momento y mantener el código corriendo mientras se recupera la conexión.