Excepciones personalizadas
1. Qué es una excepción? #
Una excepción es un evento que ocurre durante la ejecución de un programa y que interrumpe el flujo normal de las instrucciones. Cuando ocurre un error, como intentar dividir por cero o acceder a un archivo que no existe, Python genera una excepción.
2. Qué es una excepción personalizada? #
Una excepción personalizada es una excepción que tú mismo defines en tu código. Es útil cuando quieres manejar errores específicos de tu aplicación de una manera controlada y comprensible.
3. Cómo crear una excepción personalizada #
Para crear una excepción personalizada en Python, defines una nueva clase que hereda de la clase base Exception o de alguna de sus subclases.
Ejemplo de una excepción personalizada #
Supongamos que estás creando un programa donde los usuarios ingresan su edad, y deseas lanzar una excepción si la edad ingresada es negativa.
1# Definir una excepción personalizada 2class EdadInvalidaError(Exception): 3 def __init__(self, edad, mensaje="La edad no puede ser negativa"): 4 self.edad = edad 5 self.mensaje = mensaje 6 super().__init__(self.mensaje) 7 8 def __str__(self): 9 return f'{self.edad} -> {self.mensaje}' 10 11# Función para verificar la edad 12def verificar_edad(edad): 13 if edad < 0: 14 raise EdadInvalidaError(edad) 15 print(f"La edad ingresada es: {edad}") 16 17# Ejemplo de uso 18try: 19 edad_ingresada = int(input("Ingresa tu edad: ")) 20 verificar_edad(edad_ingresada) 21except EdadInvalidaError as e: 22 print(e)Salida de consola Ingresa tu edad: -5 -5 -> La edad no puede ser negativa
- ¿Qué hace este código?:
- Define una excepción personalizada
EdadInvalidaErrorque se lanza cuando se ingresa una edad negativa. - La clase
EdadInvalidaErrorhereda de la clase baseExceptiony permite mostrar un mensaje de error específico. - En la función
verificar_edad, si se ingresa una edad negativa, se lanza la excepciónEdadInvalidaError. - El bloque
tryintenta ejecutar la función, y si se lanza la excepción, el bloqueexceptla captura y muestra el mensaje de error.
- Define una excepción personalizada
4. Ventajas de usar excepciones personalizadas #
- Claridad: Proporciona mensajes de error específicos que son más fáciles de entender que las excepciones estándar.
- Control: Te permite manejar errores de una manera más precisa y específica, lo que puede hacer que tu programa sea más robusto y fácil de depurar.
- Mantenimiento: Facilita la identificación y corrección de errores en aplicaciones grandes y complejas.
5. Ejemplo extendido: Excepciones personalizadas para una cuenta bancaria #
Imagina que estás desarrollando una aplicación de cuenta bancaria y quieres manejar situaciones como intentos de retiro de dinero por un monto mayor al saldo disponible.
1# Definir excepciones personalizadas 2class SaldoInsuficienteError(Exception): 3 def __init__(self, saldo, monto, mensaje="Saldo insuficiente para realizar la transacción"): 4 self.saldo = saldo 5 self.monto = monto 6 self.mensaje = mensaje 7 super().__init__(self.mensaje) 8 9 def __str__(self): 10 return f'Intentaste retirar {self.monto}, pero solo tienes {self.saldo} disponible.' 11 12# Clase de cuenta bancaria 13class CuentaBancaria: 14 def __init__(self, saldo=0): 15 self.saldo = saldo 16 17 def depositar(self, monto): 18 self.saldo += monto 19 print(f"Depósito exitoso. Saldo actual: {self.saldo}") 20 21 def retirar(self, monto): 22 if monto > self.saldo: 23 raise SaldoInsuficienteError(self.saldo, monto) 24 self.saldo -= monto 25 print(f"Retiro exitoso. Saldo actual: {self.saldo}") 26 27# Ejemplo de uso 28try: 29 cuenta = CuentaBancaria(100) 30 cuenta.depositar(50) 31 cuenta.retirar(200) # Esto lanzará la excepción personalizada 32except SaldoInsuficienteError as e: 33 print(e)Salida de consola Depósito exitoso. Saldo actual: 150 Intentaste retirar 200, pero solo tienes 150 disponible.
- ¿Qué hace este código?:
- Define una excepción personalizada
SaldoInsuficienteErrorque se lanza cuando se intenta retirar más dinero del disponible. - La clase
CuentaBancariatiene métodos para depositar y retirar dinero. - Si intentas retirar más dinero del disponible, se lanza la excepción
SaldoInsuficienteError.
- Define una excepción personalizada
Resumen del tema
Conceptos clave #
- Herencia de
Exception: las excepciones de dominio personalizadas deben heredar directamente de la clase baseException(o derivadas específicas). - Lanzamiento con
raise: uso de la palabra claveraise MiExcepcion("mensaje", contexto)para disparar el error. - Personalización de Mensajes y Atributos: sobreescritura de
__init__(llamando asuper().__init__(mensaje)) y__str__para adjuntar metadatos contextuales al error. - Jerarquía de Excepciones del Módulo: buena práctica de definir una clase base común para el módulo/paquete (ej.
class AppError(Exception): pass) y derivar errores específicos de ella.
Qué debes recordar #
Crea excepciones personalizadas heredando de Exception y lánzalas con raise para representar errores de negocio claros y específicos.