2016-03-19 5 views
1

は私が装飾された関数がデコレータ私が向かうことができる方法デコレータで発生した例外を関数の装飾に渡すには?

def decorator(func): 
    def _decorator(request, *args, **kwargs): 
     if condition: 
      return func(request, *args, **kwargs) 
     else: 
      """ 
      THIS EXCEPTION CAN'T BE CAUGHT FROM FUNCTION DECORATED 
      """ 
      raise LimitReached 
return _decorator 

によって発生した例外をキャッチすることができたいと思いますか?

+0

例外をキャッチすることができるようにする唯一の方法は、 'try'ブロックであります。 'try'ブロックは' func() 'のどこにでも現れます。デコレータに例外をスローする場所は何ですか? – zondo

+1

'func'がどのように例外を捕まえることができるのかを知りたいのであれば、このようにコードを設計した理由を説明するために質問を編集できますか?呼び出しスタックを例外_down_に渡すことはできませんが、問題を解決する方法が異なる場合があります。 – snakecharmerb

+2

できません。 'func()'コールは*すでに完了しています*。とにかく 'func()'のどの時点で例外が発生するのでしょうか? –

答えて

1

できません。装飾された関数は内部スコープであり、デコレータの外側スコープで発生した例外をキャッチすることはできません。コードを実行する3つのステップについて考えてみましょう。

(1)デコレータは、デコレータが呼び出される前にいくつかのコードを実行します。デコレータはまだ実行されていないため、例外をキャッチできません。

(2)デコレータがデコレータを呼び出す...デコレータが実行されていないため、例外を発生させることができなくなりました。

(3)関数が戻り、デコレータコードが再び実行されます。デコレータ関数は、そのaleadyが実行を完了したために何もキャッチできません。

(編集)

問題の解決策があります。 funcは何らかの例外を捕らえなければならないことを知っています。これと同じfuncは、エラー状態であることを知らせるパラメータを持つように書くことができます。私はこれが最善の解決策であるかわからない(ここでも必要なデコレータているのですか?)私は納得でき...

def func(p1, p2, kw1=None, errorstate=None): 
    if errorstate: 
     do_error_path() 
     return 

def decorator(func): 
    def _decorator(request, *args, **kwargs): 
     if condition: 
      return func(request, *args, **kwargs) 
     else: 
      kwargs = kwargs.copy() 
      kwargs['errorstate'] = LimitReached() 
      return func(request, *args, **kwargs) 
return _decorator 
関連する問題