Resumen

Los errores en programación son inevitables, pero el código profesional los anticipa y se recupera sin detenerse. Con try, except y raise en Python, puedes crear código robusto y expresivo que comunica claramente qué falló y cómo actuar, usando además excepciones personalizadas para casos de negocio como títulos inválidos o libros no disponibles.

¿Cómo evitar que Python se detenga con errores?

Para que el programa no colapse ante entradas inválidas (por ejemplo, un título vacío o None), encapsula la operación en try y captura solo lo que esperas con except. Evita el except genérico: podría ocultar fallas no contempladas.

  • Los errores ocurren: títulos vacíos, más de tres libros, datos corruptos.
  • La diferencia profesional está en cómo se manejan.
  • Usa try para intentar, except para responder, raise para señalar el problema.

¿Cómo validar entradas como títulos vacíos?

Valida antes de continuar. Si falta el título, detén el flujo con raise y un mensaje claro.

# usuarios.py
class Estudiante:
    def __init__(self):
        self.libros_prestados = []

    def solicitar_libro(self, titulo):
        if not titulo:
            raise ValueError(f"El libro con el título {titulo} no es válido.")
        self.libros_prestados.append(titulo)
        return f"{titulo} ha sido autorizado."

¿Cómo usar try y except sin ocultar errores?

Captura la excepción en main con un mensaje entendible. No uses except: vacío; limita la captura a lo relevante.

# main.py
estudiante = Estudiante()

try:
    resultado = estudiante.solicitar_libro(None)
    print(resultado)
except Exception:
    print("Error: no se pudo solicitar el libro.")

¿Qué es raise y cuándo usarlo?

Raise interrumpe la ejecución y entrega un traceback con el mensaje del error. Después de un raise, nada más en esa ruta se ejecuta: ni print, ni lógica adicional. Úsalo cuando detectes una condición inválida y quieras que el llamador decida qué hacer.

  • Interrumpe el flujo inmediatamente.
  • Propaga contexto con mensajes claros.
  • Obliga a manejar el caso anómalo en el nivel adecuado.
def solicitar_libro(self, titulo):
    if not titulo:
        # Nada debajo de este raise se ejecutará.
        raise ValueError(f"El libro con el título {titulo} no es válido.")
    # Lógica segura.
    self.libros_prestados.append(titulo)
    return f"{titulo} ha sido autorizado."

¿Por qué crear excepciones personalizadas en Python?

Las excepciones personalizadas hacen el código más expresivo y profesional. Permiten agrupar errores por dominio y capturarlos de forma específica sin silenciar otros problemas. Crea un módulo dedicado y usa herencia para organizar la jerarquía.

# exceptions.py
class BibliotecaError(Exception):
    pass

class TituloInvalidoError(BibliotecaError):
    pass

Úsalas en tu lógica de negocio para comunicar la causa exacta.

# usuarios.py
from exceptions import TituloInvalidoError

class Estudiante:
    def __init__(self):
        self.libros_prestados = []

    def solicitar_libro(self, titulo):
        if not titulo:
            raise TituloInvalidoError(f"El libro con el título {titulo} no es válido.")
        self.libros_prestados.append(titulo)
        return f"{titulo} ha sido autorizado."

Captura por la clase base para abarcar toda la familia de errores del dominio, y usa as e para inspeccionar el tipo cuando lo necesites.

# main.py
from exceptions import BibliotecaError

try:
    print(estudiante.solicitar_libro(None))
except BibliotecaError as e:
    print("Error: no se pudo solicitar el libro.")
    print(f"{e}, tipo: {type(e)}")

# Ejemplo de llamada exitosa posterior:
print(estudiante.solicitar_libro("El Principito"))
  • Manejo específico: captura solo tu dominio con BibliotecaError.
  • Jerarquía clara: TituloInvalidoError hereda de BibliotecaError.
  • Diagnóstico rápido: imprime type(e) para decidir acciones por tipo.
  • Código expresivo: los nombres comunican la causa del fallo.

Como reto: crea LibroNoDisponibleError y úsalo en el método prestar de la clase Libro cuando no haya disponibilidad. ¿Cómo lo implementarías y qué mensaje mostrarías al usuario? Comparte tus ideas en los comentarios.