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}")