Manejo de Errores en Python: try, except, finally y raise explicados

D
DanisCh
(Actualizado: ) 7 min de lectura
Manejo de Errores en Python: try, except, finally y raise explicados
Python

Cuando empiezas a programar en Python, los errores son inevitables. Un archivo que no existe, un número donde se esperaba texto, una división entre cero… cualquier imprevisto puede hacer que tu programa se detenga por completo. La buena noticia es que Python tiene un sistema muy elegante para anticipar y controlar esas situaciones antes de que se conviertan en un problema real.

En este artículo aprenderás a usar try, except, finally y raise con ejemplos claros y prácticos. No importa si estás dando tus primeros pasos o ya llevas un tiempo con el lenguaje — dominar el manejo de errores es lo que separa el código que simplemente funciona del código que está listo para el mundo real.

1. ¿Qué son las excepciones en Python?

Una excepción es un error que ocurre durante la ejecución del programa. Cuando Python encuentra algo inesperado —como dividir entre cero o acceder a un archivo que no existe— genera una excepción y detiene el programa… a menos que tú la captures.

# Sin manejo de errores → el programa explota
numero = 10
resultado = numero / 0     # ZeroDivisionError: division by zero
print(resultado)            # Esta línea nunca se ejecuta

Python

Las excepciones más comunes en Python son:

Excepción¿Cuándo ocurre?
ZeroDivisionErrorDivisión entre cero
ValueErrorValor incorrecto para una operación
TypeErrorTipo de dato incorrecto
FileNotFoundErrorArchivo no encontrado
KeyErrorClave inexistente en un diccionario
IndexErrorÍndice fuera de rango en una lista
AttributeErrorAtributo o método no existe en el objeto
ImportErrorMódulo no encontrado al importar

 

📚 Artículos relacionados

 

2. El bloque try / except

La estructura básica del manejo de errores en Python es try / except. El código "peligroso" va dentro del try, y si ocurre un error, Python salta al bloque except en lugar de detener el programa.

try:
    numero = 10
    resultado = numero / 0
    print(resultado)

except ZeroDivisionError:
    print("Error: no puedes dividir entre cero.")

# Salida: Error: no puedes dividir entre cero.

Python

💡 Concepto clave Siempre que sea posible, especifica el tipo de excepción en el except. Evita usar un except genérico sin nombre porque oculta errores que no esperabas.

También puedes capturar el objeto de la excepción y leer su mensaje con as e:

try:
    numero = int("hola")   # no se puede convertir texto a número

except ValueError as e:
    print(f"Ocurrió un error: {e}")

# Salida: Ocurrió un error: invalid literal for int() with base 10: 'hola'

Python

3. Capturar múltiples excepciones

Puedes manejar diferentes tipos de errores con varios bloques except, cada uno reaccionando de forma distinta:

def dividir(a, b):
    try:
        resultado = a / b
        return resultado

    except ZeroDivisionError:
        print("No se puede dividir entre cero.")

    except TypeError:
        print("Ambos valores deben ser números.")

dividir(10, 0)       # → No se puede dividir entre cero.
dividir(10, "x")     # → Ambos valores deben ser números.

Python

Si quieres manejar varios errores de la misma manera, puedes agruparlos en una tupla:

try:
    # código que puede fallar
    pass

except (ValueError, TypeError) as e:
    print(f"Error de valor o tipo: {e}")

Python

4. El bloque else

El bloque else en un try/except se ejecuta solo si no ocurrió ningún error. Es ideal para separar la lógica de éxito de la lógica de error:

try:
    numero = int(input("Ingresa un número: "))

except ValueError:
    print("Eso no es un número válido.")

else:
      # Solo llega aquí si el int() funcionó sin errores
    print(f"Ingresaste el número: {numero}")

Python

5. El bloque finally

El bloque finally se ejecuta siempre, haya ocurrido un error o no. Su uso más común es liberar recursos: cerrar archivos, conexiones de base de datos o limpiar datos temporales.

try:
    archivo = open("datos.txt", "r")
    contenido = archivo.read()
    print(contenido)

except FileNotFoundError:
    print("El archivo no existe.")

finally:
      # Se ejecuta SIEMPRE, error o no
    print("Operación de lectura finalizada.")

Python

⚠️ Importante sobre finally El bloque finally se ejecuta incluso si dentro del try hay una instrucción return. Ten esto en cuenta al diseñar funciones con recursos que debes liberar.

Estructura completa: try / except / else / finally

try:
    # código que puede fallar
    resultado = 10 / 2

except ZeroDivisionError:
    # se ejecuta si ocurre ese error
    print("División por cero.")

else:
      # se ejecuta si NO hubo errores
    print(f"Resultado: {resultado}")

finally:
    # se ejecuta SIEMPRE
    print("Bloque finalizado.")

Python

6. Lanzar excepciones con raise

Con raise puedes lanzar tú mismo una excepción cuando detectas una condición inválida en tu código. Esto es fundamental para validar datos de entrada y comunicar errores a quien usa tu función.

def calcular_raiz(numero):
    if numero < 0:
        raise ValueError("No se puede calcular la raíz de un número negativo.")
    return numero ** 0.5

try:
    print(calcular_raiz(-4))

except ValueError as e:
    print(f"Error: {e}")

# Salida: Error: No se puede calcular la raíz de un número negativo.

Python

También puedes re-lanzar una excepción dentro de un except para propagarla hacia arriba:

try:
    resultado = 1 / 0

except ZeroDivisionError:
    print("Registrando error en log...")
    raise   # re-lanza la misma excepción

Python

7. Crear excepciones personalizadas

Puedes crear tus propias clases de excepción heredando de Exception. Esto hace tu código más expresivo y fácil de depurar:

class SaldoInsuficienteError(Exception):
    def __init__(self, saldo, monto):
        self.saldo = saldo
        self.monto = monto
        super().__init__(
            f"Saldo insuficiente: tienes ${saldo} pero intentas retirar ${monto}"
        )


def retirar(saldo, monto):
    if monto > saldo:
        raise SaldoInsuficienteError(saldo, monto)
    return saldo - monto


try:
    nuevo_saldo = retirar(100, 250)

except SaldoInsuficienteError as e:
    print(e)

# Salida: Saldo insuficiente: tienes $100 pero intentas retirar $250

Python

✅ Buena práctica Nombra tus excepciones personalizadas terminando en Error (por ejemplo, SaldoInsuficienteError, ConexionFallidaError). Es la convención estándar de Python.

 

8. Buenas prácticas en el manejo de errores

✅ Sé específico con las excepciones

# ❌ Malo: captura TODO y oculta bugs inesperados
except:
    pass

# ✅ Bueno: captura exactamente lo que esperas
except FileNotFoundError:
    print("El archivo no fue encontrado.")

Python

✅ Usa el contexto (with) para manejar recursos

# ✅ El 'with' cierra el archivo automáticamente, incluso ante errores
with open("datos.txt", "r") as f:
    contenido = f.read()

Python

✅ No silencies errores sin registrarlos

import logging

try:
    resultado = 10 / 0

except ZeroDivisionError:
    logging.error("División por cero detectada", exc_info=True)
    # al menos el error queda registrado

 

🔗 Sigue aprendiendo Python

 

9. Errores comunes de principiantes

❌ Error 1: Capturar Exception en lugar del error específico Usar except Exception captura prácticamente todo, incluyendo errores de programación que deberías ver y corregir, no ignorar.

❌ Error 2: Un try/except enorme Si el bloque try tiene 50 líneas, no sabes exactamente qué línea falló. Mantén los bloques pequeños y enfocados.

❌ Error 3: Ignorar el error con pass except ValueError: pass silencia el error completamente. Siempre haz algo útil: registra el error, muestra un mensaje, o retorna un valor por defecto.

❌ Error 4: Usar try/except para controlar el flujo normal Las excepciones son para situaciones excepcionales, no para reemplazar un if. Si puedes verificar una condición antes, hazlo.

 

10. Resumen: cuándo usar cada bloque

Bloque¿Cuándo se ejecuta?Uso típico
trySiempre, al inicioCódigo que puede fallar
exceptSolo si ocurre un errorManejar el error específico
elseSolo si NO hubo errorLógica de éxito separada
finallySiempre, al finalLiberar recursos (archivos, BD, conexiones)
raiseCuando tú lo llamasLanzar errores propios o re-propagar

 

Etiquetas: Python Errores comunes

¿Te ha gustado esta entrada?

Compártela con tus compañeros para que también sigan aprendiendo.

Comunidad y Comentarios

0 COMENTARIOS

No hay comentarios todavía. Sé el primero en compartir tu opinión.

Escribe tu opinión
Respondiendo a