Evite múltiples pruebas de captura en python3

He creado mi excepción personalizada y colocado que en el archivo de configuración de django.

He creado una operación de crear api. Mi api toma datos como entrada y llama a múltiples terceros crear api's si alguien falla, revierte crear operación de todos los api de terceros.

class InsertionOrderViewset(viewsets.ViewSet):   #my api
    ''' Manages insertion order dsp operations'''
    def create(self, request, format=None):
         try:
                // create api 1
         except error as e:
                 return e
         try:
                // create api 2
         except error as e:
                 // undo api 1
                 return e
         try:
                // create api 3
         except error as e:
                 // undo api 1
                 // undo api 2
                 return e

¿Hay alguna manera de evitar escribir múltiples pruebas de captura en esos escenarios de vuelta?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por bitwisewizard


3 Respuestas:

  • Estoy pensando que esto debería darte la misma salida.

    class InsertionOrderViewset(viewsets.ViewSet):  # my api
    """Manages insertion order dsp operations"""
    
    def create(self, request, format=None):
        try:
            # create api 1
        except error as e:
            # undo api 1
            # create api 2
        except error2 as e:
            # undo api 2
            # create api 3
        except Exception as e:
            return e
    

    Respondida el Dec 18, 2020 a las 13:33 - por geekguru

    Votos positivos: 0 | Votos negativos: 0

  • Sí, puedes evitar escribir múltiples bloques de try/except en esos escenarios utilizando el bloque finally. El bloque finally se ejecutará siempre, independientemente de si se produce una excepción o no. Puedes utilizarlo para realizar las operaciones de reversión necesarias una vez que se ha producido una excepción.

    Aquí te muestro cómo puedes refactorizar tu código para utilizar el bloque finally y evitar la repetición de bloques de try/except:

    python
    class InsertionOrderViewset(viewsets.ViewSet):
        ''' Manages insertion order dsp operations'''
    
        def create(self, request, format=None):
    
            api1_created = False
            api2_created = False
            api3_created = False
    
            try:
                

    create api 1

    api1_created = True except Error1 as e: return e finally: if not api1_created:

    undo api 1

    try:

    create api 2

    api2_created = True except Error2 as e:

    undo api 1

    return e finally: if not api2_created:

    undo api 1

    undo api 2

    try:

    create api 3

    api3_created = True except Error3 as e:

    undo api 1

    undo api 2

    return e finally: if not api3_created:

    undo api 1

    undo api 2

    undo api 3

    En este código, utilizamos variables booleanas (api1_created, api2_created, api3_created) para realizar un seguimiento de si cada API se creó correctamente. Luego, en el bloque finally, verificamos si la API se creó o no, y si no se creó, realizamos las operaciones de reversión correspondientes.

    Esto te ayudará a evitar la repetición de bloques de try/except y a mantener un código más limpio y organizado.

    Respondida el Dec 19, 2020 a las 13:32 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Usar decoradores personalizados

    Puedes crear un decorador personalizado que intente ejecutar una función y, si falla, deshaga las operaciones de creación anteriores. Aquí tienes un ejemplo:

    python
    from functools import wraps
    
    def handle_creation(func):
        @wraps(func)
        def wrapper(args, kwargs):
            try:
                return func(args, *kwargs)
            except Exception as e:
                

    Deshaz las operaciones de creación anteriores aquí

    return e return wrapper @handle_creation def create_api_1(data):

    Código para crear la API 1

    @handle_creation def create_api_2(data):

    Código para crear la API 2

    @handle_creation def create_api_3(data):

    Código para crear la API 3

    Uso:

    python
    try:
        create_api_1(data)
        create_api_2(data)
        create_api_3(data)
    except Exception as e:
        

    El decorador se encargará de deshacer las operaciones de creación anteriores

    Ventajas:

    Reduce la duplicación de código: Elimina la necesidad de escribir pruebas de captura repetitivas. Mejora la legibilidad: Hace que el código sea más fácil de leer y mantener. Manejo de excepciones centralizado: Permite un manejo de excepciones coherente en todas las operaciones de creación.

    Nota: El decorador solo puede deshacer las operaciones dentro de su propia función. Si necesitas deshacer operaciones en otras funciones o módulos, deberás implementar mecanismos de deshacer personalizados.

    Respondida el Dec 19, 2020 a las 13:46 - por Gemini

    Votos positivos: 0 | Votos negativos: 0