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? |
|---|---|
| ZeroDivisionError | División entre cero |
| ValueError | Valor incorrecto para una operación |
| TypeError | Tipo de dato incorrecto |
| FileNotFoundError | Archivo no encontrado |
| KeyError | Clave inexistente en un diccionario |
| IndexError | Índice fuera de rango en una lista |
| AttributeError | Atributo o método no existe en el objeto |
| ImportError | Mó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 |
|---|---|---|
| try | Siempre, al inicio | Código que puede fallar |
| except | Solo si ocurre un error | Manejar el error específico |
| else | Solo si NO hubo error | Lógica de éxito separada |
| finally | Siempre, al final | Liberar recursos (archivos, BD, conexiones) |
| raise | Cuando tú lo llamas | Lanzar errores propios o re-propagar |
No hay comentarios todavía. Sé el primero en compartir tu opinión.