Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> python

Dominando Excepciones Personalizadas en Python: Guía Práctica

Excepciones Personalizadas en Python

En este tutorial aprenderás a definir excepciones personalizadas adaptadas a tus necesidades, ilustrado con ejemplos prácticos.

Python proporciona muchas excepciones integradas que señalan errores cuando un programa encuentra condiciones inesperadas. Sin embargo, hay momentos en que las integradas no describen precisamente el problema que estás enfrentando. En esos casos, puedes crear tus propios tipos de excepción personalizados para hacer tu código más claro y fácil de mantener.


Crear Excepciones Personalizadas

Definir una excepción personalizada en Python es sencillo: crea una nueva clase que herede de la clase integrada Exception (o una de sus subclases). La mayoría de las excepciones estándar derivan de Exception, así que tu clase personalizada se integrará perfectamente con el sistema de manejo de errores de Python.

> >>> class CustomError(Exception):
...     pass
...
>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
>>> raise CustomError("Ocurrió un error")
Traceback (most recent call last):
...
__main__.CustomError: Ocurrió un error

Aquí, CustomError es una excepción definida por el usuario que hereda de Exception. Puede lanzarse con raise y un mensaje opcional. Al construir proyectos grandes, es práctica común colocar todas las excepciones personalizadas en un módulo dedicado (ej. exceptions.py o errors.py) para que sean fáciles de localizar y mantener.


Ejemplo: Excepción Definida por el Usuario en Python

El siguiente programa demuestra cómo las excepciones personalizadas pueden guiar la entrada del usuario. Pide repetidamente un número hasta que adivinen el valor almacenado. El programa da una pista —si la suposición es muy alta o muy baja— lanzando una excepción a medida.

# definir excepciones definidas por el usuario en Python
class Error(Exception):
    """Clase base para otras excepciones"""
    pass

class ValueTooSmallError(Error):
    """Lanzada cuando el valor de entrada es demasiado pequeño"""
    pass

class ValueTooLargeError(Error):
    """Lanzada cuando el valor de entrada es demasiado grande"""
    pass

# el número objetivo
number = 10

# seguir preguntando hasta que la suposición sea correcta
while True:
    try:
        i_num = int(input("Ingresa un número: "))
        if i_num < number:
            raise ValueTooSmallError
        elif i_num > number:
            raise ValueTooLargeError
        break
    except ValueTooSmallError:
        print("¡Este valor es demasiado pequeño, inténtalo de nuevo!")
        print()
    except ValueTooLargeError:
        print("¡Este valor es demasiado grande, inténtalo de nuevo!")
        print()

print("¡Felicidades! Adivinaste correctamente.")

Ejecución de muestra:

Ingresa un número: 12 ¡Este valor es demasiado grande, inténtalo de nuevo! Ingresa un número: 0 ¡Este valor es demasiado pequeño, inténtalo de nuevo! Ingresa un número: 8 ¡Este valor es demasiado pequeño, inténtalo de nuevo! Ingresa un número: 10 ¡Felicidades! Adivinaste correctamente.

En este ejemplo, la clase base Error proporciona un ancestro común para los dos tipos de error específicos. Este enfoque mantiene la jerarquía de excepciones clara y permite capturar todos los errores relacionados con un solo except Error si se desea.


Personalizando Clases de Excepción

Las excepciones personalizadas también pueden almacenar datos adicionales o presentar mensajes más informativos. Esto requiere sobrescribir __init__ y opcionalmente __str__. El siguiente ilustra un escenario de validación de salario.

class SalaryNotInRangeError(Exception):
    """Excepción lanzada para errores en el salario de entrada.
    Atributos:
        salary -- salario de entrada que causó el error
        message -- explicación del error
    """
    def __init__(self, salary, message="El salario no está en el rango (5000, 15000)"):
        self.salary = salary
        self.message = message
        super().__init__(self.message)

salary = int(input("Ingresa monto de salario: "))
if not 5000 < salary < 15000:
    raise SalaryNotInRangeError(salary)

Salida

Ingresa monto de salario: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: El salario no está en el rango (5000, 15000)

Al sobrescribir __init__, la excepción puede llevar el valor infractor. Si quieres una representación de cadena personalizada, sobrescribe __str__ como se muestra abajo:

class SalaryNotInRangeError(Exception):
    """Excepción lanzada para errores en el salario de entrada.
    Atributos:
        salary -- salario de entrada que causó el error
        message -- explicación del error
    """
    def __init__(self, salary, message="El salario no está en el rango (5000, 15000)"):
        self.salary = salary
        self.message = message
        super().__init__(self.message)

    def __str__(self):
        return f'{self.salary} → {self.message}'

salary = int(input("Ingresa monto de salario: "))
if not 5000 < salary < 15000:
    raise SalaryNotInRangeError(salary)

Salida

Ingresa monto de salario: 2000 Traceback (most recent call last): File "/home/user/untitled.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 → El salario no está en el rango (5000, 15000)

Para una inmersión más profunda en patrones de manejo de excepciones, consulta el tutorial Python Exception Handling.

Para aprender más sobre diseño de aplicaciones robustas, explora Programación Orientada a Objetos en Python.

python

  1. Dominando tipos de datos en Python: Guía práctica
  2. Dominando operadores en Python: Guía completa
  3. Dominando la sentencia pass en Python: Guía práctica
  4. Dominando argumentos de funciones en Python: Posicionales, por palabra clave y por defecto
  5. Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
  6. Dominando Errores y Excepciones Integradas en Python
  7. Dominando la Programación Orientada a Objetos en Python: Clases, Herencia, Encapsulación y Polimorfismo
  8. Dominando la Herencia en Python: Conceptos, Sintaxis y Ejemplos Prácticos
  9. Dominando Iteradores en Python: Cómo Funcionan y Cómo Crear los Tuyos
  10. Entendiendo type() e isinstance() en Python: ejemplos prácticos
  11. Manejo de Excepciones en Python: Guía Completa y Práctica