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.
- Manejar/Capturar errores en Python.
- Manejar/Capturar errores en Python con tipo de error.
- Capturar cancelación de programa (Control + C) en Python.
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:
1 2 3 |
#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
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:
1 2 3 4 5 6 |
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á:
1 2 3 4 5 6 7 8 9 10 |
#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á") |
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:
1 2 3 4 5 6 7 8 9 |
#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 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:
1 2 3 4 5 6 7 8 9 10 11 12 |
#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».
Para mostrar el error que devuelve el propio lenguaje Python, podemos usar el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#Manejo de errores en Python #Capturar de error por tipo de error #Conversión de números y división por cero #Mostrar error que devuelve el lenguaje Python 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 as ex: print("Has intentado dividir un número entre cero."); print("El error concreto es: {0}, de tipo {1}".format(ex,type(ex))) |
Que devolverá, si se produce el error:
El error concreto es: division by zero, de tipo class ‘ZeroDivisionError’
Otro ejemplo de tratamiento y captura de errores con Python es el siguiente, donde mostramos la descripción del error que se produce, el tipo de error e incluso podemos mostrar un mensaje personalizado si se produce un error concreto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
try: # Ejemplo captura de error de división por cero numero = 25 / 0 # Si se produce error en la línea anterior, esta ya no se ejecutará print("Esta línea no se ejecutará") except Exception as ex: # Mostrar el tipo de error y la descrpición print('Tipo de error: ' + getattr(ex, 'message', repr(ex))) # Mostrar la descripción del error print('Descripción del error: ' + getattr(ex, 'message', str(ex))) #También se puede obtener la descripción del error con ex.args[0] if ex.args[0] == "division by zero": print("Se ha producido un error de divisón por cero.") else: # Si se produce un error diferente a "division by zero" print("Se ha producido un error: " + getattr(ex, 'message', str(ex))) |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#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.