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 bloquefinally
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 bloquefinally
, 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