Saltar al contenido principal
eLearner.app
Módulo 2 · Lección 4 de 48/36 en el curso~12 min
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

Python
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 del try.

Capturar el mensaje de excepción

Usa as para vincular el objeto de excepción a un nombre:

Python
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

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Una tupla de tipos captura cualquier excepción de esos tipos (o subclases).

La estructura completa: try / except / else / finally

Python
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 exception
  • else — úsalo para código que depende del éxito del try. 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:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Las 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 bloque try se 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ú

Ejercicio#python.m2.l4.e1
Intentos: 0Cargando...

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`.

Cargando editor...
Mostrar pista

int('abc') genera un ValueError.

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#python.m2.l4.e2
Intentos: 0Cargando...

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.

Cargando editor...
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

Ejercicio#python.m2.l4.e3
Intentos: 0Cargando...

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`.

Cargando editor...
Mostrar pista

Usa try: result = int(text_val) seguido de except ValueError: result = None.

Solución disponible después de 3 intentos