Cómo comprobar si una función levanta una excepción en Python

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo verificar si una función levanta una excepción en Python. El laboratorio comienza explorando las excepciones y cómo pueden ocurrir dentro de las funciones. Crearás una función simple de Python que podría levantar un ZeroDivisionError y observarás la traza de la pila (traceback) cuando ocurra la excepción.

A continuación, implementarás un bloque try-except para manejar la excepción de manera elegante. Finalmente, aprenderás cómo usar pytest.raises para probar si una función levanta una excepción específica (introducción opcional).


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") subgraph Lab Skills python/catching_exceptions -.-> lab-559520{{"Cómo comprobar si una función levanta una excepción en Python"}} python/raising_exceptions -.-> lab-559520{{"Cómo comprobar si una función levanta una excepción en Python"}} end

Explorar Excepciones en Funciones

En este paso, aprenderás sobre las excepciones y cómo pueden ocurrir dentro de las funciones en Python. Comprender las excepciones es crucial para escribir código robusto y confiable. Las excepciones son eventos que interrumpen el flujo normal de ejecución de un programa. Pueden ocurrir por diversas razones, como entrada inválida, archivo no encontrado o errores de red.

Comencemos creando una función simple de Python que podría levantar una excepción. Abre el editor de VS Code en el entorno de LabEx y crea un nuevo archivo llamado exceptions_example.py en el directorio ~/project.

## ~/project/exceptions_example.py
def divide(x, y):
    return x / y

print(divide(10, 2))
print(divide(5, 0))

En este código:

  • Definimos una función llamada divide que toma dos argumentos, x y y, y devuelve el resultado de x dividido por y.
  • Primero llamamos a la función divide con los argumentos 10 y 2, lo que resultará en que se imprima 5.0 en la consola.
  • Luego, llamamos a la función divide con los argumentos 5 y 0. Esto causará un ZeroDivisionError porque la división por cero no está permitida.

Ahora, ejecutemos este script. Abre la terminal en VS Code (puedes encontrarla en "View" -> "Terminal") y ejecuta el siguiente comando:

python ~/project/exceptions_example.py

Verás una salida similar a esta:

5.0
Traceback (most recent call last):
  File "/home/labex/project/exceptions_example.py", line 4, in <module>
    print(divide(5, 0))
  File "/home/labex/project/exceptions_example.py", line 2, in divide
    return x / y
ZeroDivisionError: division by zero

Como puedes ver, la primera instrucción print se ejecutó correctamente y se imprimió el resultado 5.0. Sin embargo, cuando se llamó a la función divide con y = 0, se produjo un ZeroDivisionError y el programa se terminó. La traza de la pila (traceback) muestra la secuencia de llamadas a funciones que condujo a la excepción, lo que puede ser útil para depurar.

Este ejemplo demuestra cómo las excepciones pueden ocurrir dentro de las funciones y cómo pueden interrumpir el flujo normal de un programa. En el siguiente paso, aprenderás cómo manejar las excepciones utilizando bloques try y except.

Implementar un Bloque try-except

En el paso anterior, viste cómo las excepciones pueden hacer que un programa termine abruptamente. Para manejar las excepciones de manera elegante y evitar que el programa se bloquee, puedes utilizar bloques try y except.

Un bloque try te permite encerrar una sección de código que podría levantar una excepción. Si se produce una excepción dentro del bloque try, el programa saltará al bloque except correspondiente, donde puedes manejar la excepción.

Modifiquemos el archivo exceptions_example.py para incluir un bloque try-except que maneje el ZeroDivisionError. Abre el archivo exceptions_example.py en el editor de VS Code y modifícalo de la siguiente manera:

## ~/project/exceptions_example.py
def divide(x, y):
    try:
        result = x / y
        return result
    except ZeroDivisionError:
        return "Cannot divide by zero!"

print(divide(10, 2))
print(divide(5, 0))
print(divide(8, 4))

En este código modificado:

  • Hemos agregado un bloque try alrededor de la operación x / y. Esto significa que si se produce un ZeroDivisionError durante la división, el programa saltará al bloque except.
  • La línea except ZeroDivisionError: especifica que queremos manejar las excepciones ZeroDivisionError.
  • Dentro del bloque except, devolvemos la cadena "Cannot divide by zero!". Esto se imprimirá en la consola en lugar de que el programa se bloquee.

Ahora, ejecutemos el script modificado. Abre la terminal en VS Code y ejecuta el siguiente comando:

python ~/project/exceptions_example.py

Verás una salida similar a esta:

5.0
Cannot divide by zero!
2.0

Como puedes ver, el programa ya no se bloquea cuando se divide por cero. En cambio, el bloque except captura el ZeroDivisionError y se imprime el mensaje "Cannot divide by zero!". Luego, el programa continúa ejecutándose y la última instrucción print también se ejecuta correctamente.

Los bloques try-except también se pueden utilizar para manejar otros tipos de excepciones. Por ejemplo, puedes utilizar un bloque try-except para manejar las excepciones TypeError que podrían ocurrir si intentas realizar una operación con tipos de datos incompatibles. También puedes tener múltiples bloques except para manejar diferentes tipos de excepciones.

En el siguiente paso, aprenderás cómo usar pytest para probar excepciones.

Probar con pytest.raises (Introducción Opcional)

En este paso opcional, recibirás una breve introducción sobre cómo usar pytest para probar excepciones. pytest es un popular marco de pruebas (testing framework) para Python que simplifica el proceso de escribir y ejecutar pruebas.

Primero, instalemos pytest. Abre la terminal en VS Code y ejecuta el siguiente comando:

pip install pytest

Este comando descargará e instalará pytest y sus dependencias.

Ahora, creemos un archivo de prueba para nuestra función divide. Crea un nuevo archivo llamado test_exceptions.py en el directorio ~/project.

## ~/project/test_exceptions.py
import pytest
from exceptions_example import divide

def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError):
        divide(5, 0)

def test_divide_valid():
    assert divide(10, 2) == 5

En este código:

  • Importamos el módulo pytest y la función divide de nuestro archivo exceptions_example.py.
  • Definimos una función de prueba llamada test_divide_by_zero. Esta función utiliza pytest.raises para afirmar que llamar a divide(5, 0) levantará un ZeroDivisionError. El bloque with pytest.raises(ZeroDivisionError): asegura que la prueba solo pasará si se levanta un ZeroDivisionError dentro del bloque.
  • Definimos otra función de prueba llamada test_divide_valid. Esta función afirma que llamar a divide(10, 2) devuelve el valor 5.

Para ejecutar las pruebas, abre la terminal en VS Code y ejecuta el siguiente comando:

pytest ~/project/test_exceptions.py

Deberías ver una salida similar a esta:

============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-7.4.4, pluggy-1.3.0
rootdir: /home/labex/project
collected 2 items

test_exceptions.py ..                                                      [100%]

============================== 2 passed in 0.01s ===============================

La salida muestra que se recolectaron dos pruebas y que ambas pruebas pasaron. Esto indica que nuestra función divide se comporta como se espera: levanta un ZeroDivisionError cuando se divide por cero y devuelve el resultado correcto cuando se divide por un número distinto de cero.

Este es un ejemplo muy básico de cómo usar pytest para probar excepciones. pytest tiene muchas otras características que pueden ayudarte a escribir pruebas más completas y efectivas.

Resumen

En este laboratorio, comenzaste explorando las excepciones en funciones de Python, comprendiendo que las excepciones son eventos que interrumpen el flujo normal de un programa. Creaste una función divide que levanta un ZeroDivisionError cuando se divide por cero. Al ejecutar el script, se demuestra cómo la excepción termina el programa y proporciona un rastreo (traceback) para la depuración.

El laboratorio destaca la importancia de entender las excepciones para escribir código robusto, mostrando un ejemplo sencillo de una función que puede levantar una excepción y cómo observar el error resultante y el rastreo cuando se produce la excepción.