Explicamos de forma sencilla cómo manejar (controlar) errores en Python. Mostramos por qué capturar los errores y las diferentes formas que podemos utilizar en Python: try…except…finally, con ejemplos. Capturamos error por tipo (ValueError, ZeroDivisionError).

El manejo de errores

En el caso en que no se controlen los errores, las aplicaciones pueden generar errores «extraños» al usuario, e incluso pueden dejar de funcionar. Por ejemplo, supongamos que nuestro programa tiene un «fallo» y divide entre 0 en una operación:

#Dará error de división por cero y saldrá del programa
num1 = 3
numDiv = num1/0

El código anterior dará error y como no lo hemos manejado, la aplicación se cerrará y mostrará:

Traceback (most recent call last):
File «d:\ProyectoA_Python\manejo_errores.py», line 5, in numDiv = num1/0
ZeroDivisionError: division by zero

El manejo de errores

Para evitar este comportamiento se utiliza la captura (manejo) de errores, con ello el programa no se cerrará cuando se produzca el error y, además, podremos mostrar un mensaje personalizado cuando se produzca un error o bien ejecutar algún código adicional.

Manejar/Capturar errores en Python

Para el manejo de errores en Python se utiliza:

try:
...
except:
...
finally:
...

De forma que el código que quede entre el try y el except se ejecutará si no se produce error. Si se produce error se ejecutará el código que haya en el except y siempre se ejecutará el código que haya en el finally, tanto si se produce error como sino. El finally puede omitirse.

Veamos un ejemplo con el código que anteriormente daba error de división por cero:

El resultado de la ejecución del código anterior será:

#Manejo de errores en Python
#Captura de error de divisón por cero
try:
    num1 = 3
    numDiv = num1/0
    print("Si no se produjera error, continuaría por aquí")
except:
    print("Error al intentar dividir un número entre cero")
finally:
    print("Esto siempre se ejecutará")
Manejar/Capturar errores en Python

En el siguiente ejemplo pediremos una edad al usuario por consola, mientras no introduzca un número válido la aplicación seguirá pidiendo la edad indefinidamente:

#Manejo de errores en Python
#Capturar de error de tipo de datos
while True:
    try:
        edad = int(input("Introduce tu edad: "))
        print("Tu edad es de {} años".format(edad))
        break 
    except:
        print("No has introducido un número, vuelve a intentarlo")
Manejar/Capturar errores en Python

Manejar/Capturar errores en Python con tipo de error

Si queremos «afinar» un poco más y queremos mostrar mensajes personalizados al usuario o ejecutar código cuando se produce un error específico, de algún tipo concreto, también podremos hacerlo con Python.

Por ejemplo, en el caso del error de división por cero, si queremos manejar este error concreto, lo haremos de la siguiente forma:

#Manejo de errores en Python
#Capturar de error por tipo de error
#Conversión de números y división por cero
try:
    numero1 = int(input("Introduce un número: "))
    numero2 = int(input("Introduce un segundo número: "))
    division = numero1 / numero2
    print("{} / {} = {}".format(numero1, numero2, division))
except ValueError:
    print("Debes introducir números")
except ZeroDivisionError:
    print("Has intentado dividir un número entre cero")

En el ejemplo anterior vemos que hemos capturados dos tipos de excepciones:

  • ValueError: que sirve para capturar un posible error en la conversión de números. En el ejemplo, si el usuario no introduce un número válido, se capturará con esta excepción y se mostrará el mensaje «Debes introducir un número».
  • ZeroDivisionError: en este caso, capturamos un posible error si el usuario introduce, en el segundo número, un 0, dado que no es posible dividir un número entre cero, por lo que lo capturamos y mostramos el mensaje «Has intentado dividir un número entre cero».

Capturar cancelación de programa (Control + C) en Python

También podemos capturar la posible cancelación (Cierre forzado) de un programa por el usuario. Cuando se pulsa la combinación de teclas Control + C en un programa de línea de comandos, se abortará la ejecución del programa. Python permite capturar este cierre «forzado» para hacer cualquier operación antes del cierre, para cancelar el cierre forzado o para mostrar algún mensaje al usuario. Explicamos cómo hacerlo con un sencillo ejemplo:

#Manejo de errores en Python
#Capturar cancelación de programa Control + C
while True:
    try:
        edad = int(input("Introduce tu edad: "))
        print("Tu edad es de {} años".format(edad))
        break 
    except ValueError:
        print("No has introducido un número, vuelve a intentarlo")
    except KeyboardInterrupt:
        cerrar = input("\n¿Estás seguro que deseas cerrar el programa? (S/N) ")
        if cerrar.upper() == "S":
            print("Aplicación cerrada por usuario")
            break

En el ejemplo anterior, creamos un bucle de forma que el programa pedirá una edad al usuario por consola, si introduce un número, mostrará «Tu edad es de numero años» y se cerrará correctamente. En cambio, si el usuario no introduce un número, el error de conversión será capturado en el except de ValueError y mostrará: No has introducido un número, vuelve a intentarlo. Y si el usuario pulsa las teclas Control + C durante la ejecución del programa, será capturado en KeyboardInterrupt y solicitará al usuario si realmente quiere salir. Si pulsa «S» la aplicación se cerrará, en caso contrario continuará en ejecución en el bucle.

Capturar cancelación de programa (Control + C) en Python