Crear excepciones personalizadas en Python

Rayven Esplanada 10 octubre 2023
  1. Crear una clase de excepción personalizada en Python
  2. Ejecute el manejo de excepciones usando el bloque try...except en Python
Crear excepciones personalizadas en Python

Este tutorial demostrará que puede crear clases de excepción personalizadas en Python. Aquí, mostraremos cómo puede realizar correctamente el manejo de excepciones, definir clases de excepciones personalizadas y anular las excepciones integradas existentes.

Las excepciones son un tipo de evento que ocurre cuando algo dentro de un programa no funciona como se esperaba o interrumpe el flujo del caso de uso previsto del programa. Sin el manejo de excepciones, el programa dejará de ejecutarse por completo y la excepción tendrá que arreglarse o manejarse.

Crear una clase de excepción personalizada en Python

La creación de una clase de excepción en Python se realiza de la misma manera que una clase normal. La principal diferencia es que tienes que incluir la clase base de Python Exception para informar al compilador que la clase que estás creando es una clase de excepción.

Probemos este método para crear una clase de excepción llamada DemoException y usemos la palabra clave de flujo de control de marcador de posición pass dentro como marcador de posición.

class DemoException(Exception):
    pass

Ejecute la generación de excepciones utilizando la palabra clave raise en Python

Para probar la clase DemoException y ver qué muestra cuando realmente se activa, realice la generación de excepciones. La generación de excepciones es sinónimo de la generación de excepciones en otros lenguajes de programación.

Usando la palabra clave raise, desencadena una excepción usando la clase de excepción dada y genera un mensaje de excepción.

class DemoException(Exception):
    pass


raise DemoException

Producción :

Traceback (most recent call last):
  File "/Users/demo/python/demo_exception.py", line 4, in <module>
    raise DemoException
__main__.DemoException

Una excepción estándar se verá en la terminal si no se ha declarado ningún mensaje de excepción personalizado.

Declarar un mensaje de excepción personalizado en Python

Para declarar un mensaje de excepción personalizado para DemoException, anule el método __init__() de la clase de excepción e incluya el mensaje que debe enviarse para la excepción en los parámetros, junto con el parámetro autorreferencial obligatorio self.

Por ejemplo, anulemos el método __init__() y creemos un mensaje personalizado para la clase DemoException:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)

Tenga en cuenta que para que el mensaje se integre con éxito en su excepción, llame a la clase base Exception, método __init__() e incluya el message como argumento.

Llamemos a la clase de excepción nuevamente usando la palabra clave raise, y ahora, pasando un mensaje personalizado con ella:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


message = "Exception Triggered! Something went wrong."
raise DemoException(message)

La salida debería verse así:

Traceback (most recent call last):
  File "/Users/demo/python/helloworld.py", line 6, in <module>
    raise DemoException(message)
__main__.DemoException: Exception Triggered! Something went wrong.

Ahora hemos creado y activado con éxito una clase de excepción con un mensaje de error personalizado.

Para situaciones reales que pueden desencadenar una excepción, ¿cómo manejamos y planteamos estas excepciones? Puede resolver este problema perfectamente implementando el manejo de excepciones usando el bloque try...except.

Ejecute el manejo de excepciones usando el bloque try...except en Python

El bloque try...except es muy parecido al bloque try-catch en otros lenguajes como Java.

El bloque try...except tiene 2 bloques principales y 2 bloques opcionales:

  • try (obligatorio): el bloque principal responsable de encapsular el bloque de código donde se puede activar la excepción. El bloque try detiene todo el proceso dentro de él cada vez que se activa una excepción.
  • except (obligatorio): el programa de bloques continúa siempre que se activa una excepción especificada. Este bloque normalmente contiene un mensaje de error descriptivo para la persona que llama o simplemente una simple declaración print(). Puede haber más de un bloque except en un solo bloque try, cada uno detectando excepciones diferentes.
  • else (opcional): este bloque opcional es donde el programa procederá si el bloque try no desencadenó ninguna excepción.
  • finally (opcional): este bloque opcional se ejecuta una vez que se ha realizado todo de los 3 bloques anteriores independientemente de si se activa una excepción o no.

Usemos el ejemplo anterior usando la clase DemoException para probar un bloque simple try...except.

Primero, envuelva la palabra clave raise en una función y colóquela dentro del bloque try...except.

La función que crearemos para este ejemplo es una función que acepta un número y lanza una excepción si envía 0. Si envía cualquier otro número, el código procederá según lo previsto. Mira el ejemplo a continuación:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


message = "Exception Triggered! Something went wrong."


def triggerException(num):
    if num == 0:
        raise DemoException(message)
    else:
        print(num)


try:
    triggerException(0)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

Dado que triggerException() pasó 0 como argumento, el código debería activar DemoException. Aquí deberíamos esperar que el mensaje de palabra clave raise sea anulado con lo que esté dentro del bloque except como salida.

Observe que la línea print() después de la llamada a la función triggerException() no se emitió. Es porque la función generó una excepción; por lo tanto, detuvo inmediatamente todos los procesos dentro del bloque try y procedió directamente al bloque except.

Producción :

Error: Number should not be 0.

Ahora, intentemos pasar un número válido como 20, por ejemplo.

try:
    triggerException(20)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

Producción :

20
Code has successfully been executed.

Intentemos encadenar los bloques except y creemos otra excepción. Llamemos a la nueva excepción NumberFormatException, que se activa si la entrada dada no es un número. Para esta clase de excepción, declaremos el mensaje dentro de la clase.

class NumberFormatException(Exception, value):
    message = f"{value} is not a number"

    def __init__(self):
        super().__init__(message)

Ahora, modifique el código anterior para manejar la nueva clase de excepción NumberFormatException:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


class NumberFormatException(Exception):
    def __init__(self, message, value):
        message = f"{value} is not a number"
        super().__init__(message)


message = "Exception occured."


def triggerException(num):
    if not num.isdigit():
        raise NumberFormatException(message, num)
    elif num == 0:
        raise DemoException(message)
    else:
        print(num)


num = "sample string"
try:
    triggerException(num)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")
except NumberFormatException:
    print(num + " is not a number.")

En este código, el valor de num que se pasó a triggerException() es una cadena 'sample string' por lo que la NumberFormatException debe activarse.

Producción :

sample string is not a number.

En resumen, crear excepciones personalizadas en Python es tan simple como crear una nueva clase, pero con la clase Exception como un argumento adicional en la definición de la clase. La palabra clave raise se utiliza para activar excepciones dada la Clase de excepción. Los bloques try...except se utilizan para envolver una o más excepciones dentro de un bloque de código y modificar lo que hace el código cuando maneja esa excepción y no solo para cerrar el programa por completo.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Artículo relacionado - Python Exception