2017-04-23 7 views
0

djangoでエラー処理デコレータを作成しようとしています。例外が発生した場合にデコレータでロギングが発生し、例外が修飾された関数に返され、httpというエラーが送信されます応答。Djangoのデコレータによる例外の処理

しかし、これをやろうとすると、デコレータの例外が戻された後に、デコレータ機能に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をデコレータから実行し、その内部で例外をキャッチするため、デコレータには表示されません。私はあなたがraisetarget_functionの例外は、デコレータで行っていると思う。しかし、装飾された機能を除いてResponseを返さなければならないので、問題は解決しにくいようです...