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).
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
divideque toma dos argumentos,xyy, y devuelve el resultado dexdividido pory. - Primero llamamos a la función
dividecon los argumentos10y2, lo que resultará en que se imprima5.0en la consola. - Luego, llamamos a la función
dividecon los argumentos5y0. Esto causará unZeroDivisionErrorporque 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
tryalrededor de la operaciónx / y. Esto significa que si se produce unZeroDivisionErrordurante la división, el programa saltará al bloqueexcept. - La línea
except ZeroDivisionError:especifica que queremos manejar las excepcionesZeroDivisionError. - 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
pytesty la funcióndividede nuestro archivoexceptions_example.py. - Definimos una función de prueba llamada
test_divide_by_zero. Esta función utilizapytest.raisespara afirmar que llamar adivide(5, 0)levantará unZeroDivisionError. El bloquewith pytest.raises(ZeroDivisionError):asegura que la prueba solo pasará si se levanta unZeroDivisionErrordentro del bloque. - Definimos otra función de prueba llamada
test_divide_valid. Esta función afirma que llamar adivide(10, 2)devuelve el valor5.
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.



