Skip to content

Las excepciones

Son bloques de código excepcionales que nos permiten continuar con la ejecución de un programa pese a que ocurra un error.

Try - Except

Para prevenir el error, debemos poner el código propenso a error un bloque try y luego encadenaremos un bloque except para tratar la excepción:

try:
    n = float(input("Introduce un número: "))
    m = 4
    print("{}/{}={}".format(n,m,n/m))
except:
    print("Ha ocurrido un error, introduce bien el número")
Introduce un número: aaa
Ha ocurrido un error, introduce bien el número

Excepciones en bucle

Utilizando un while(true), podemos asegurárnos de que el usuario introduce bien el valor

Repitiendo la lectura por teclado hasta que lo haga bien, y entonces rompemos el bucle con un break:

while(True):
    try:
        n = float(input("Introduce un número: "))
        m = 4
        print("{}/{}={}".format(n,m,n/m))
        break  # Importante romper la iteración si todo ha salido bien
    except:
        print("Ha ocurrido un error, introduce bien el número")
Introduce un número: aaa
Ha ocurrido un error, introduce bien el número
Introduce un número: 10
10.0/4=2.5

Else en excepciones

Es posible encadenar un bloque else después del except para comprobar el caso en que todo funcione correctamente (no se ejecuta la excepción).

El bloque else es un buen momento para romper la iteración con break si todo funciona correctamente:

while(True):
    try:
        n = float(input("Introduce un número: "))
        m = 4
        print("{}/{}={}".format(n,m,n/m))
    except:
        print("Ha ocurrido un error, introduce bien el número")
    else:
        print("Todo ha funcionado correctamente")
        break  # Importante romper la iteración si todo ha salido bien
Introduce un número: 10
10.0/4=2.5
Todo ha funcionado correctamente

Finally en excepciones

Por último es posible utilizar un bloque finally que se ejecute al final del código, ocurra o no ocurra un error:

while(True):
    try:
        n = float(input("Introduce un número: "))
        m = 4
        print("{}/{}={}".format(n,m,n/m))
    except:
        print("Ha ocurrido un error, introduce bien el número")
    else:
        print("Todo ha funcionado correctamente")
        break  # Importante romper la iteración si todo ha salido bien
    finally:
        print("Fin de la iteración") # Siempre se ejecuta
Introduce un número: aaa
Ha ocurrido un error, introduce bien el número
Fin de la iteración
Introduce un número: 10
10.0/4=2.5
Todo ha funcionado correctamente
Fin de la iteración

Capturando múltiples excepciones

Guardando la excepción

Podemos asignar una excepción a una variable (por ejemplo e). De esta forma haciendo un pequeño truco podemos analizar el tipo de error que sucede gracias a su identificador:

try:
    n = input("Introduce un número: ")
    5/n
except Exception as e:
    print( type(e).__name__ )
Introduce un número: 10
TypeError

Encadenando excepciones

Gracias a los identificadores de errores podemos crear múltiples comprobaciones, siempre que dejemos en último lugar la excepción por defecto Excepcion que engloba cualquier tipo de error (si la pusiéramos al principio, las demas excepciones nunca se ejecutarían):

try:
    n = float(input("Introduce un número: "))
    5/n
except TypeError:
    print("No se puede dividir el número por una cadena")
except ValueError:
    print("Debes introducir una cadena que sea un número")
except ZeroDivisionError:
    print("No se puede dividir por cero, prueba otro número")
except Exception as e:
    print( type(e).__name__ )
Introduce un número: aaaa
ValueError

Invocación de excepciones

La instrucción raise

Gracias a raise podemos lanzar un error manual pasándole el identificador. Luego simplemente podemos añadir un except para tratar esta excepción que hemos lanzado:

def mi_funcion(algo=None):
    try:
        if algo is None:
            raise ValueError("Error! No se permite un valor nulo")
    except ValueError:
        print("Error! No se permite un valor nulo (desde la excepción)")
mi_funcion()
Error! No se permite un valor nulo (desde la excepción)

Ejercicio

Realiza una función llamada agregar_una_vez() que reciba una lista y un elemento. La función debe añadir el elemento al final de la lista con la condición de no repetir ningún elemento. Además si este elemento ya se encuentra en la lista se debe invocar un error de tipo ValueError que debes capturar y mostrar este mensaje en su lugar:

  Error: Imposible añadir elementos duplicados => [elemento].

Pueba de agregar los elementos 10, -2, "Hola" a la lista de elementos con la función una vez la has creado y luego muestra su contenido.

elementos = [1, 5, -2]

def agregar_una_vez(lista, el):
    try:
        if el in lista:
            raise ValueError
        else:
            lista.append(el)
    except ValueError:
        print("Error: Imposible añadir elementos duplicados =>", el)


agregar_una_vez(elementos, 10)
agregar_una_vez(elementos, -2)
agregar_una_vez(elementos, "Hola")
print(elementos)
Error: Imposible añadir elementos duplicados => -2
[1, 5, -2, 10, 'Hola']