Lecciones del módulo (4/4)
Gestión de errores: try/except
Cuando algo sale mal en tiempo de ejecución (una división por cero, una clave
faltante, una operación en tipos incompatibles) Python genera una excepción.
Sin manejo, la excepción interrumpe el programa. Con try / except puedes
capturarla y decidir qué hacer.
La forma básica
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- el bloque
try:contiene el código que puede fallar; - el
except <ErrorType>:se ejecuta solo si ese tipo de error se genera dentro deltry.
Capturar el mensaje de excepción
Usa as para vincular el objeto de excepción a un nombre:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"Múltiples tipos juntos
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneUna tupla de tipos captura cualquier excepción de esos tipos (o subclases).
La estructura completa: try / except / else / finally
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— úsalo para código que depende del éxito deltry. Mantenlo separado para no capturar accidentalmente excepciones no relacionadas.finally— limpieza que siempre debe ocurrir (cerrar un archivo, liberar un recurso). Se ejecuta tanto en caso de éxito como de error.
Generar una excepción: raise
A veces eres tú quien quiere indicar que algo salió mal:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bLas excepciones integradas más comunes que encontrarás y generarás:
ValueError— el valor tiene el tipo correcto pero es inaceptable (ej. parsing).TypeError— el tipo es incorrecto (ej.len(42)).KeyError/IndexError— clave/índice faltante.ZeroDivisionError— división por cero.FileNotFoundError,PermissionError— operaciones del sistema de archivos.
Las cláusulas else y finally en bloques try
Un bloque try puede definir dos cláusulas adicionales:
else: se ejecuta solo si el bloquetryse completa sin generar ninguna excepción.finally: se ejecuta siempre, independientemente de si ocurrió una excepción. Esto es ideal para limpiar recursos (ej. cerrar un archivo abierto o una conexión a la base de datos).
Pruébalo tú
Escribe una expresión que intente int('abc'): si se genera un ValueError, asigna la cadena 'errore' a `result`; de lo contrario, asigna el número. Evalúa `result`.
Mostrar pista
int('abc') genera un ValueError.
Solución disponible después de 3 intentos
Ejercicio de repaso
Define `divide(a, b)` que devuelva a/b pero genere un ValueError con el mensaje 'divisore zero' si b es 0. Luego llama a divide(10, 0) dentro de un try/except y asigna a `message` la cadena de la excepción capturada.
Mostrar pista
raise ValueError('...') dentro de la función; captura con except ValueError as e.
Solución disponible después de 3 intentos
Desafío adicional
Escribe un bloque `try-except` para convertir la cadena `text_val = "abc"` en un entero. Si la conversión genera un `ValueError`, asigna `None` a `result`. De lo contrario, asigna el número convertido. Finalmente, evalúa `result`.
Mostrar pista
Usa try: result = int(text_val) seguido de except ValueError: result = None.
Solución disponible después de 3 intentos