2017-04-23 91 views
0

我想在django中创建一个错误处理装饰器,并在装饰器中发生异常并且异常被引发回装饰函数然后发送错误http响应。在Django中通过装饰器处理异常

但是当我尝试这样做的时候,如果我在装饰函数的异常被引发后在装饰函数中添加一个Except块,那么只有装饰函数的except块得到执行,并且装饰器的except块是未执行。

MyDecorator.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 decorator 

装饰功能

@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'}) 

这是打印线

除了装饰功能的块

,而不是线

除了装饰

的块如果删除了除了从装饰功能块,则除了被获取执行装饰的块。

任何帮助理解如何处理这个异常跟踪在装饰器是赞赏。

回答

0

这是一个正常的行为:你从装饰器中运行target_function,并且你在里面捕获异常,所以装饰器看不到它。我认为你必须在target_function中设置raise这个例外,就像你在装饰器中完成的那样。但是,由于您必须在装饰功能除外返回Response,问题似乎很难解决...