できません。装飾された関数は内部スコープであり、デコレータの外側スコープで発生した例外をキャッチすることはできません。コードを実行する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
例外をキャッチすることができるようにする唯一の方法は、 'try'ブロックであります。 'try'ブロックは' func() 'のどこにでも現れます。デコレータに例外をスローする場所は何ですか? – zondo
'func'がどのように例外を捕まえることができるのかを知りたいのであれば、このようにコードを設計した理由を説明するために質問を編集できますか?呼び出しスタックを例外_down_に渡すことはできませんが、問題を解決する方法が異なる場合があります。 – snakecharmerb
できません。 'func()'コールは*すでに完了しています*。とにかく 'func()'のどの時点で例外が発生するのでしょうか? –