En este tutorial vamos a ver qué son y cómo gestionar las excepciones en MicroPython para manejar errores en nuestro código.3
Una excepción es un evento que ocurre durante la ejecución de un programa y que interrumpe el flujo normal de las instrucciones.
Estas situaciones pueden ser causadas por errores en el código, condiciones inesperadas en el hardware o problemas en los datos de entrada.
En MicroPython, las excepciones son objetos que representan estos errores. Cuando ocurre una excepción, el programa se detiene a menos que la excepción sea capturada y gestionada.
Si quieres aprender más consulta,
Estructura básica de gestión de excepciones
En MicroPython, la gestión de excepciones se realiza utilizando los bloques try
y except
. La estructura básica es la siguiente:
try:
# Código que puede generar una excepción
resultado = dividir(10, 0)
except ZeroDivisionError:
# Código que se ejecuta si ocurre una excepción ZeroDivisionError
print("Error: No se puede dividir por cero.")
Aquí colocamos el código que puede generar una excepción. Si ocurre una excepción dentro de este bloque, el flujo del programa se desvía al bloque except
.
Aquí manejamos la excepción. Podemos especificar el tipo de excepción que queremos capturar (por ejemplo, ZeroDivisionError
) o usar un except
genérico para capturar cualquier excepción.
Este bloque se ejecuta si no se genera ninguna excepción en el bloque try
.
Este bloque se ejecuta siempre, independientemente de si se generó una excepción o no. Es útil para liberar recursos o realizar tareas de limpieza.
Vamos a verlo con un ejemplo completo que incluya los bloques try
, except
, else
y finally
try:
resultado = dividir(10, 2) # Esto no generará una excepción
except ZeroDivisionError:
print("Error: No se puede dividir por cero.")
else:
print(f"El resultado es: {resultado}")
finally:
print("Fin del bloque try-except.")
En este ejemplo, como no se genera una excepción, se ejecutan los bloques else
y finally
.
También podemos capturar múltiples tipos de excepciones en un solo bloque try-except
:
try:
valor = int("no es un número") # Esto generará un ValueError
except ValueError:
print("Error: Valor no válido.")
except TypeError:
print("Error: Tipo de dato incorrecto.")
Tipos comunes de excepciones en MicroPython
MicroPython define varios tipos de excepciones que podemos capturar y manejar. Algunas de las más comunes son:
Error | Descripción |
---|---|
ZeroDivisionError | Ocurre al intentar dividir por cero. |
TypeError | Ocurre cuando se realiza una operación con tipos de datos incompatibles. |
ValueError | Ocurre cuando se pasa un valor inapropiado a una función. |
IndexError | Ocurre al intentar acceder a un índice fuera de los límites de una lista o array. |
NameError | Ocurre cuando se intenta usar una variable o función que no está definida. |
OSError | Ocurre en operaciones relacionadas con el sistema de archivos o E/S (por ejemplo, al intentar abrir un archivo que no existe). |
Ejemplos prácticos
Validación de entrada de usuario
Este ejemplo muestra cómo manejar una entrada inválida del usuario:
try:
edad = int(input("Ingresa tu edad: "))
except ValueError:
print("Error: Debes ingresar un número válido.")
else:
if edad >= 18:
print("Eres mayor de edad.")
else:
print("Eres menor de edad.")
Gestión de ficheros
En este ejemplo, el archivo se cierra siempre, independientemente de si ocurrió una excepción o no.
try:
archivo = open("datos.txt", "r")
contenido = archivo.read()
except OSError as e:
print(f"Error al abrir el archivo: {e}")
else:
print("Archivo leído correctamente.")
finally:
if 'archivo' in locals():
archivo.close()
print("Archivo cerrado.")
Manejo de errores en operaciones de hardware
En dispositivos embebidos, es común trabajar con sensores y actuadores. Aquí te mostramos cómo manejar errores al leer un sensor:
from machine import Pin, ADC
sensor = ADC(Pin(34))
try:
valor = sensor.read()
except OSError as e:
print(f"Error al leer el sensor: {e}")
else:
print(f"Valor del sensor: {valor}")
Manejo de excepciones en comunicaciones I2C
Al trabajar con dispositivos I2C, es posible que ocurran errores de comunicación. Aquí te mostramos cómo manejarlos:
from machine import I2C, Pin
i2c = I2C(scl=Pin(22), sda=Pin(21))
try:
dispositivos = i2c.scan()
except OSError as e:
print(f"Error en la comunicación I2C: {e}")
else:
print(f"Dispositivos encontrados: {dispositivos}")