Estoy tratando de crear un decorador de manejo de errores en django y donde ocurre el registro en el decorador en caso de una excepción y la excepción se vuelve a generar en la función decorada que luego envía una respuesta http de error.
Pero cuando intento hacer esto, si agrego un bloque de excepción en la función decorada después de que se vuelve a generar la excepción del decorador, entonces solo se ejecuta el bloque de excepción de la función decorada y el bloque de excepción del decorador queda sin ejecutar.
MiDecorador.py
def log_error(message): def decorator(target_function): @functools.wraps(target_function) def wrapper(*args, **kwargs): try: return target_function(*args, **kwargs) except Exception as e: print('except block of the decorator') exceptiontype, exc_obj, exc_tb = sys.exc_info() filename = traceback.extract_tb(exc_tb)[-2][0] linenumber = traceback.extract_tb(exc_tb)[-2][1] mylogger(message=str(e),description='Related to Registration',fileName=filename,lineNumber=linenumber, exceptionType = type(e).__name__) raise return wrapper return decoratorfunción decorada
@log_error('message') def action(self, serializer): try: .................. .................. .................. .................. return Response(status=status.HTTP_200_OK, data={ "message":'link sent successfully'}) except Exception as e: print('except block of the decorated function') return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR, data={"message" : 'error sending link'})Esto es imprimir la línea.
excepto bloque de la función decorada
y no la linea
excepto bloque del decorador
Si elimino el bloque Excepto de la función decorada, entonces se ejecuta el bloque Excepto del decorador.
Se agradece cualquier ayuda para comprender cómo se maneja este seguimiento de excepción en los decoradores.
Este es un comportamiento normal: ejecuta target_function desde el decorador y detecta la excepción dentro de él, por lo que el decorador no la ve. Creo que debe raise la excepción en target_function , como lo hizo en el decorador. Pero como tienes que devolver una Response en la excepción de la función decorada, el problema parece difícil de resolver...