Saltar al contenido principal
InicioTutorialesPython

Manejo de excepciones y errores en Python

Los errores y las excepciones pueden provocar fallos en el programa o comportamientos inesperados, y Python viene con un sólido conjunto de herramientas para mejorar la estabilidad del código.
may 2024  · 21 min leer

Run and edit the code from this tutorial online

Run Code

try except else finally proceso en Python

Los errores y las excepciones pueden provocar un comportamiento inesperado o incluso detener la ejecución de un programa. Python proporciona varias funciones y mecanismos para manejar estos problemas y mejorar la robustez del código. En este tutorial, aprenderemos sobre varios tipos de error y aprenderemos sobre funciones incorporadas con ejemplos. 

Un error es un problema en un programa que impide que éste complete su tarea. En comparación, una excepción es una condición que interrumpe el flujo normal del programa. Tanto los errores como las excepciones son un tipo de error en tiempo de ejecución, lo que significa que se producen durante la ejecución de un programa. 

En palabras sencillas, el error es un problema crítico que una aplicación normal no debería detectar, mientras que una excepción es una condición que un programa debería detectar. 

Veamos varios ejemplos para aprender más sobre errores y excepciones. 

Errores en Python

He aquí un ejemplo de error de sintaxis en el que un retorno fuera de la función no significa nada. No debemos manejar los errores en un programa. En su lugar, debemos crear una función que devuelva la cadena. 

return "DataCamp"
Input In [1]
    return "DataCamp"
    ^
SyntaxError: 'return' outside function

Hemos creado la función, pero con una sangría incorrecta. No debemos tratar los errores de indentación en tiempo de ejecución. O lo hacemos manualmente o utilizamos herramientas de formateo de código.

def fun():
return "DataCamp"    
Input In [2]
    return "DataCamp"
    ^
IndentationError: expected an indented block

Excepciones en Python

Hemos encontrado un ZeroDivisionError (Excepción). Podemos manejarlo en tiempo de ejecución utilizando los bloques `try` y `except`.

test = 1/0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Input In [4], in <cell line: 1>()
----> 1 test = 1/0

ZeroDivisionError: division by zero

Las excepciones NameError son bastante comunes cuando no se encuentra una variable. También podemos manejar la excepción sustituyendo la variable o imprimiendo la advertencia. 

y = test
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Input In [5], in <cell line: 1>()
----> 1 y = test

NameError

Excepciones incorporadas en Python

Aquí está la lista de excepciones por defecto de Python con sus descripciones:

  1. AssertionError: se produce cuando falla la sentencia assert.
  2. EOFError: se produce cuando la función input() cumple la condición de fin de archivo.
  3. AttributeError: se produce cuando falla la asignación o referencia de un atributo.
  4. TabError: se produce cuando las sangrías consisten en tabulaciones o espacios incoherentes. 
  5. ImportError: se produce cuando falla la importación del módulo. 
  6. IndexError: se produce cuando el índice de una secuencia está fuera de rango
  7. KeyboardInterrupt: se activa cuando el usuario introduce teclas de interrupción (Ctrl + C o Supr).
  8. RuntimeError: se produce cuando un error no entra en ninguna categoría. 
  9. NameError: se produce cuando una variable no se encuentra en el ámbito local o global. 
  10. MemoryError: se produce cuando los programas se quedan sin memoria. 
  11. ValueError: se produce cuando la operación o función recibe un argumento con el tipo correcto pero el valor incorrecto. 
  12. ZeroDivisionError: se produce al dividir un valor o variable por cero. 
  13. SyntaxError: provocado por el analizador sintáctico cuando la sintaxis de Python es incorrecta. 
  14. IndentationError: se produce cuando hay una sangría incorrecta.
  15. SystemError: aparece cuando el intérprete detecta un error interno.

Puedes encontrar una lista completa de errores y excepciones en Python leyendo la documentación

Aprenda sobre las excepciones de Python tomando nuestro curso de Programación Orientada a Objetos en Python. Le enseñará a crear clases y aprovechar la herencia y el polimorfismo para reutilizar y optimizar el código.

Manejo de excepciones con try, except, else y finally

Después de aprender sobre errores y excepciones, aprenderemos a manejarlos utilizando los bloques try, except, else y finally. 

Entonces, ¿qué entendemos por manejarlos? En circunstancias normales, estos errores detendrán la ejecución del código y mostrarán el mensaje de error. Para crear sistemas estables, debemos anticiparnos a estos errores e idear soluciones alternativas o mensajes de advertencia. 

En esta sección, aprenderemos qué hace cada bloque y cómo podemos utilizarlos para escribir código robusto. 

Declaración try y except 

La forma más sencilla de manejar excepciones en Python es usando los bloques `try` y `except`.  

  1. Ejecute el código bajo la sentencia `try`.
  2. Cuando se lanza una excepción, ejecuta el código bajo la sentencia `except`. 

En lugar de detenerse ante un error o una excepción, nuestro código avanzará hacia soluciones alternativas. 

Sentencia try except en Python

Ejemplo sencillo

En el primer ejemplo, intentaremos imprimir la variable indefinida `x`. En circunstancias normales, debería lanzar el error y detener la ejecución, pero con el bloque `try` y `except`, podemos cambiar el comportamiento del flujo. 

  • El programa ejecutará el código bajo la sentencia `try`. 
  • Como sabemos que `x` no está definida, ejecutará la sentencia except e imprimirá la advertencia.
try:
   print(x)
except:
   print("An exception has occurred!")
An exception has occurred!

Ejemplo de sentencia except múltiple

En el segundo ejemplo, usaremos múltiples sentencias `except` para manejar múltiples tipos de excepciones.

  •  Si se lanza una excepción ZeroDivisionError, el programa imprimirá "No se puede dividir un valor con cero".
  • Para el resto de las excepciones, imprimirá "Algo más salió mal".

Nos permite escribir código flexible que puede manejar múltiples excepciones a la vez sin romperse. 

try:
   print(1/0)
except ZeroDivisionError:
   print("You cannot divide a value with zero")
except:
   print("Something else went wrong")
You cannot divide a value with zero

Cargar el archivo de ejemplo

Veamos ahora un ejemplo más práctico. 

En el siguiente código, estamos leyendo el archivo CSV, y cuando se produce la excepción FileNotFoundError, el código imprimirá el error y un mensaje adicional sobre el archivo `data.csv`. 

Sí, podemos imprimir mensajes de error por defecto sin interrumpir la ejecución. 

try:
   with open('data.csv') as file:
       read_data = file.read()
except FileNotFoundError as fnf_error:
   print(fnf_error)
   print("Explanation: We cannot load the 'data.csv' file")
[Errno 2] No such file or directory: 'data.csv'
Explanation: We cannot load the 'data.csv' file

probar con la cláusula else

Hemos aprendido sobre `try` y `except`, y ahora aprenderemos sobre la sentencia `else`.

Cuando la sentencia `try` no lanza una excepción, el código entra en el bloque `else`. Es el remedio o una opción alternativa cuando espera que una parte de su script produzca una excepción. Generalmente se utiliza en una breve sección de configuración o verificación en la que no se desea que se oculten ciertos errores. 

Nota: En el bloque try-except, puede utilizar `else` después de todas las sentencias `except`. 

try con cláusula else en Python

Ejemplo sencillo

Estamos añadiendo la sentencia `else` al ejemplo ZeroDivisionError. Como podemos ver, cuando no hay excepciones, se ejecuta la función print bajo la sentencia `else`, mostrando el resultado. 

try:
   result = 1/3
except ZeroDivisionError as err:
   print(err)
else:
   print(f"Your answer is {result}")
Your answer is 0.3333333333333333

IndexError con else ejemplo

Vamos a aprender más creando una función sencilla y probándola en varios escenarios. 

La función `find_nth_value` tiene como argumentos `x` (lista) y `n` (número de índice). Hemos creado un bloque try, except y else para manejar la excepción IndexError. 

x = [5,8,9,13]

def find_nth_value(x,n):
    try:
        result = x[n]
    except IndexError as err:
        print(err)
    else:
        print("Your answer is ", result)

La lista `x` tiene cuatro valores y la probaremos para el índice 6 y el índice 2. 

# Testing
find_nth_value(x,6)
find_nth_value(x,2)
  • En n=6, se lanzó la excepción IndexError, y llegamos a ver el mensaje de error por defecto "índice de lista fuera de rango". 
  • En n=2, no se lanzó ninguna excepción, y la función imprimió el resultado que está bajo la sentencia `else`. 
list index out of range
Your answer is  9

palabra clave finally en python

La palabra clave `finally` en el bloque try-except siempre se ejecuta, independientemente de si hay una excepción o no. En palabras simples, el bloque de código `finally` se ejecuta después del try, excepto que el bloque else es final. Es bastante útil para limpiar los recursos y cerrar el objeto, especialmente cerrar los archivos.

palabra clave finally en Python

La función `divide` se crea para manejar las excepciones ZeroDivisionError y mostrar el resultado cuando no hay excepciones. No importa cual sea el resultado, siempre se ejecutará `finalmente` para imprimir "Code by DataCamp" en color verde.

def divide(x,y):
    try:
        result = x/y
    except ZeroDivisionError:
        print("Please change 'y' argument to non-zero value")
    except:
        print("Something went wrong")
    else:
        print(f"Your answer is {result}")
    finally:
        print("\033[92m Code by DataCamp\033[00m")

En la primera prueba, estamos dividiendo 1 entre 0, lo que debería lanzar la excepción ZeroDivisionError e imprimir el mensaje. Como podemos ver, tenemos una línea adicional después del mensaje de error. 

divide(1,0)
Please change 'y' argument to non-zero value
 Code by DataCamp

Cuando añadimos una entrada válida, muestra el resultado ejecutando los bloqueos `else` y `finally`.

divide(3,4)
Your answer is 0.75
 Code by DataCamp

En lugar de un entero, hemos añadido una cadena como segundo argumento que ha lanzado una excepción, que es diferente de ZeroDivisionError, con un mensaje diferente. 

divide(1,'g')
Something went wrong
 Code by DataCamp

En los tres escenarios hay algo en común. El código siempre ejecuta la función print bajo la sentencia `finally`.

Si eres nuevo en Python y quieres programar como un verdadero programador, prueba nuestro curso de Programación en Python. Aprenderá a escribir código eficiente, funciones de Python, ingeniería de software, pruebas unitarias y programación orientada a objetos. 

Manejo de excepciones anidadas en Python

Necesitamos el manejo de excepciones anidadas cuando estamos preparando el programa para manejar múltiples excepciones en una secuencia. Por ejemplo, podemos añadir otro bloque try-except bajo la sentencia `else`. Por lo tanto, si la primera declaración no plantea una excepción y comprobar la segunda declaración con la otra mitad del código. 

Modificación de la función Divide

Hemos modificado la función `divide` del ejemplo anterior y hemos añadido un bloque try-except anidado bajo la sentencia `else`. Así, si no hay AttributeError, ejecutará el `else` y comprobará el nuevo código para la excepción ZeroDivisionError.

def divide(x,y):
    
    try:
        value = 50
        x.append(value)
    
    except AttributeError as atr_err:
        print(atr_err)
        
    else:
        try:
            result = [i / y for i in x]
            print( result )
 except ZeroDivisionError:
            print("Please change 'y' argument to non-zero value")

    finally:
        print("\033[92m Code by DataCamp\033[00m")

En el primer escenario, estamos proporcionando la lista de 3 valores `x` y denominador 3. El script añadirá 50 a la lista y dividirá el valor individual de la lista por 3 y mostrará el resultado. 

x = [40,65,70,87]
divide(x,3)

La función se ha ejecutado correctamente sin lanzar ninguna excepción.

[13.333333333333334, 21.666666666666668, 23.333333333333332, 29.0, 16.666666666666668]
 Code by DataCamp

En lugar de una lista, hemos proporcionado un número entero al primer argumento, lo que ha provocado AttributeError.

divide(4,3)
'int' object has no attribute 'append'
 Code by DataCamp

En el último escenario, hemos proporcionado la lista pero 0 como segundo argumento que ha planteado la excepción ZeroDivisionError bajo la sentencia `else`. 

divide(x,0)
Please change 'y' argument to non-zero value
 Code by DataCamp

Ejemplo de edición de archivos

Veamos ejemplos más prácticos de carga del fichero, escritura de un texto y cierre del fichero. 

La función file_editor lo hará:

  • Comprueba la excepción FileNotFoundError de la función `open()`.
  • Si no se lanza la excepción externa, comprobará la excepción de la función `write()`.
  • Pase lo que pase, después de abrir el archivo, lo cerrará ejecutando la sentencia `finally`. 
  • Si la sentencia try externa lanza la excepción, devolverá el mensaje de error con una ruta de archivo no válida. 
def file_editor(path,text):
    try:
      data = open(path)

      try:
        data.write(text)

      except:
        print("Unable to write the data. Please add an append: 'a' or write: 'w' parameter to the open() function.")

      finally:
        data.close()

    except:
      print(f"{path} file is not found!!")

En el primer caso, proporcionamos la ruta del archivo y el texto.

path = "data.txt"
text = "DataLab: Share your data analysis in a cloud-based environment--no installation required."

file_editor(path,text)

Se lanza la excepción externa. 

data.txt file is not found!!

Para resolver la excepción de archivo no encontrado, debemos crear un archivo "data.txt" utilizando el comando `echo` de Linux. 

!echo "File by DataCamp" > "data.txt"

edición de archivos en el espacio de trabajo

Después, vuelva a ejecutar la función `file_editor()`.

file_editor(path,text)

Se lanza la excepción interna, ya que la función `write` no es capaz de añadir el texto.

Unable to write the data. Please add an append: 'a' or write: 'w' parameter to the open() function.

Para resolver este problema, tenemos que cambiar la tercera línea de `data = open(path)` a `data = open(path, 'a')`. Nos permitirá añadir el nuevo texto al archivo. 

Tras volver a ejecutar la función, hemos añadido correctamente el texto al archivo. 

file_editor(path,text)

captura de pantalla de edición de archivos en el espacio de trabajo

No se recomienda el manejo de excepciones anidadas ya que hace que el manejo de excepciones sea más complejo; en su lugar, los desarrolladores utilizan múltiples bloques try-except para crear un manejo de excepciones secuencial simple. 

Nota: también puede añadir un bloque try-except anidado bajo la sentencia `try` o `except`. Depende de sus necesidades. 

Cómo lanzar excepciones en Python

Como desarrollador de Python, tienes la opción de lanzar una excepción si se cumplen ciertas condiciones. Le permite interrumpir el programa en función de sus necesidades. 

Para lanzar una excepción, debemos utilizar la palabra clave `raise` seguida de un nombre de excepción. 

Ejemplo de error de valor

Podemos simplemente lanzar excepciones añadiendo una palabra clave raise en la sentencia if/else. 

En el ejemplo, lanzamos el error ValueError si el valor es superior a 1.000. Hemos cambiado el valor a 2.000, lo que ha hecho que la sentencia `if` sea TRUE y que se produzca un ValueError con el mensaje personalizado. El mensaje de error personalizado le ayuda a averiguar el problema rápidamente. 

value = 2_000
if value > 1_000:   
    # raise the ValueError
    raise ValueError("Please add a value lower than 1,000")
else:
    print("Congratulations! You are the winner!!")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

----> 4     raise ValueError("Please add a value lower than 1,000")
      5 else:
      6     print("Congratulations! You are the winner!!")

ValueError: Please add a value lower than 1,000

Ejemplo de excepción

También podemos lanzar cualquier excepción aleatoria incorporada en Python si se cumple la condición. En nuestro caso, hemos planteado una "Excepción" genérica con el mensaje de error.

if value > 1_000:   
    # raise the Exception
    raise Exception("Please add a value lower than 1,000")
else:
    print("Congratulations! You are the winner!!")
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
----> 3     raise Exception("Please add a value lower than 1,000")
      4 else:
      5     print("Congratulations! You are the winner!!")

Exception: Please add a value lower than 1,000

Ejemplo de tratamiento de una excepción planteada

También podemos crear nuestra excepción personalizada y manejar la excepción utilizando el bloque try-except. 

En el ejemplo, hemos añadido un ejemplo de error de valor bajo la sentencia `try`.  

Entonces, ¿cómo funcionará? En lugar de lanzar la excepción y terminar el programa, mostrará el mensaje de error que hemos proporcionado.

value = 2_000
try:
    if value > 1_000:
          
        # raise the ValueError
        raise ValueError("Please add a value lower than 1,000")
    else:
        print("Congratulations! You are the winner!!")
              
# if false then raise the value error
except ValueError as e:
        print(e)

Este tipo de manejo de excepciones nos ayuda a prepararnos para los errores que no están cubiertos por Python y que son específicos de los requisitos de su aplicación. 

Please add a value lower than 1,000

Conclusión

Tanto las pruebas unitarias como el manejo de excepciones son la parte central de la programación en Python que hace que tu código esté listo para la producción y a prueba de errores. En este tutorial, hemos aprendido sobre excepciones y errores en Python y cómo manejarlos. Además, hemos aprendido sobre bloques try-except anidados complejos y hemos creado bloques de excepción personalizados en función de los requisitos.  

Estas herramientas y mecanismos son esenciales, pero la mayor parte del trabajo se realiza mediante simples bloques `try` y `except`. Donde `try` busca excepciones planteadas por el código y `except` maneja esas excepciones. 

Si esto le resulta confuso y no sabe por dónde empezar, complete nuestro curso Python Data Science Toolbox (Part 1) para comprender el alcance, las funciones Lambda y la gestión de errores. También puede matricularse en el itinerario profesional de Programador de Py thon para adquirir competencias que le permitan desarrollar su carrera y convertirse en un desarrollador profesional de Python. 



Temas

Cursos de Python

Certificación disponible

Course

Introducción a Python

4 hr
5.5M
Domina los fundamentos del análisis de datos con Python en sólo cuatro horas. Este curso online introducirá la interfaz de Python y explorará paquetes populares.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

tutorial

Cómo recortar una cadena en Python: Tres métodos diferentes

Aprenda los fundamentos del recorte de caracteres iniciales y finales de una cadena en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Pandas Profiling (ydata-profiling) en Python: Guía para principiantes

Aprenda a utilizar la biblioteca ydata-profiling en Python para generar informes detallados de conjuntos de datos con muchas características.
Satyam Tripathi's photo

Satyam Tripathi

9 min

tutorial

Guía completa de listas vacías en Python

Aprenda las principales operaciones con listas y los casos de uso de las listas vacías en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Guía paso a paso para hacer mapas en Python usando la librería Plotly

Haz que tus datos destaquen con impresionantes mapas creados con Plotly en Python
Moez Ali's photo

Moez Ali

7 min

tutorial

Tutorial de Python Seaborn Line Plot: Crear visualizaciones de datos

Descubra cómo utilizar Seaborn, una popular biblioteca de visualización de datos de Python, para crear y personalizar gráficos de líneas en Python.
Elena Kosourova's photo

Elena Kosourova

12 min

tutorial

Gráfico lineal de series temporales Matplotlib

Este tutorial explora cómo crear y personalizar gráficos de líneas de series temporales en matplotlib.
Elena Kosourova's photo

Elena Kosourova

8 min

See MoreSee More