En este tutorial, aprenderá a definir excepciones personalizadas según sus requisitos con la ayuda de ejemplos.
Python tiene numerosas excepciones integradas que obligan a su programa a generar un error cuando algo en el programa sale mal.
Sin embargo, a veces es posible que deba crear sus propias excepciones personalizadas que sirvan a su propósito.
Crear excepciones personalizadas
En Python, los usuarios pueden definir excepciones personalizadas creando una nueva clase. Esta clase de excepción debe derivarse, directa o indirectamente, de la Exception
clase incorporada . La mayoría de las excepciones integradas también se derivan de esta clase.
>>> class CustomError(Exception):… pass… >>> raise CustomError Traceback (most recent call last):… __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last):… __main__.CustomError: An error occurred
Aquí, hemos creado una excepción definida por el usuario llamada CustomError
que hereda de la Exception
clase. Esta nueva excepción, al igual que otras excepciones, se puede generar utilizando la raise
declaración con un mensaje de error opcional.
Cuando estamos desarrollando un programa Python grande, es una buena práctica colocar todas las excepciones definidas por el usuario que nuestro programa genera en un archivo separado. Muchos módulos estándar hacen esto. Definen sus excepciones por separado como exceptions.py
o errors.py
(generalmente, pero no siempre).
La clase de excepción definida por el usuario puede implementar todo lo que puede hacer una clase normal, pero generalmente las hacemos simples y concisas. La mayoría de las implementaciones declaran una clase base personalizada y derivan otras clases de excepción de esta clase base. Este concepto se aclara en el siguiente ejemplo.
Ejemplo: excepción definida por el usuario en Python
En este ejemplo, ilustraremos cómo se pueden utilizar las excepciones definidas por el usuario en un programa para generar y detectar errores.
Este programa le pedirá al usuario que ingrese un número hasta que adivine correctamente un número almacenado. Para ayudarlos a resolverlo, se les proporciona una pista si su conjetura es mayor o menor que el número almacenado.
# define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")
Aquí hay una muestra de ejecución de este programa.
Ingrese un número: 12 Este valor es demasiado grande, ¡inténtelo de nuevo! Ingrese un número: 0 Este valor es demasiado pequeño, ¡inténtelo de nuevo! Ingrese un número: 8 Este valor es demasiado pequeño, ¡inténtelo de nuevo! Ingrese un número: 10 ¡Felicitaciones! Lo adivinaste correctamente.
Hemos definido una clase base llamada Error
.
Las otras dos excepciones ( ValueTooSmallError
y ValueTooLargeError
) que realmente genera nuestro programa se derivan de esta clase. Esta es la forma estándar de definir excepciones definidas por el usuario en la programación de Python, pero no está limitado solo a esta forma.
Personalización de clases de excepción
Podemos personalizar aún más esta clase para aceptar otros argumentos según nuestras necesidades.
Para aprender a personalizar las clases de excepción, necesita tener los conocimientos básicos de programación orientada a objetos.
Visite Programación orientada a objetos de Python para comenzar a aprender sobre la programación orientada a objetos en Python.
Veamos un ejemplo:
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Salida
Ingrese el monto del salario: 2000 Traceback (última llamada más reciente): Archivo "", línea 17, en aumento SalaryNotInRangeError (salario) __main __. SalaryNotInRangeError: El salario no está en el rango (5000, 15000)
Aquí, hemos anulado el constructor de la Exception
clase para aceptar nuestros propios argumentos personalizados salary
y message
. Luego, el constructor de la Exception
clase padre se llama manualmente con el self.message
argumento usando super()
.
El self.salary
atributo personalizado está definido para usarse más adelante.
El __str__
método heredado de la Exception
clase se usa para mostrar el mensaje correspondiente cuando SalaryNotInRangeError
se genera.
También podemos personalizar el __str__
método en sí anulándolo.
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'(self.salary) -> (self.message)' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Salida
Ingrese el monto del salario: 2000 Traceback (última llamada más reciente): Archivo "/home/bsoyuj/Desktop/Untitled-1.py", línea 20, en aumento SalaryNotInRangeError (salario) __main __. SalaryNotInRangeError: 2000 -> El salario no está en ( 5000, 15000) rango
Para obtener más información sobre cómo puede manejar las excepciones en Python, visite Manejo de excepciones de Python.