2016-07-05 5 views
2

複数のデコレータでspyneに問題があります。私はクラスの各メソッドにユニバーサルtry/except decoratorを追加したいと思います。私のコードは次のようになります。私は、引数エラーの数を取得@try_exceptで複数のデコレータをspyneで使用する方法

def try_except(fn): 
     def wrapped(*args, **kwargs): 
      try: 
       return fn(*args, **kwargs) 
      except Exception: 
       do_sth() 
    return wrapped 

class A(ServiceBase): 

@rpc(Unicode, Integer, _returns=[Boolean, Integer], _out_variable_names=["FooResult", "bar"]) 
@try_except 
def Foo(self, foo, bar): 
    do_sth() 
    return True, 0 

、私が間違って何をやっていますか?

+1

トレースバックを追加できますか? – obskyr

+0

デコレータは* inside out *に適用されるので、 'rpc'ラッパーのコードからスローされたエラーは' try_except'によって捕捉されません – jonrsharpe

答えて

1

デコレータはおすすめしません。彼らはサポートされていないからではなく、彼らは非常に強力ではないし、潜在的な行動もあるからです。

例外処理の場合、ApplicationまたはServiceBaseのいずれかの関数をプロジェクト内のあるクラスにオーバーライドして、株式Spyneクラスの代わりに使用することができます。 super()コールを囲むようにtry/exceptブロックを設定する必要があります。

ServiceBase.call_wrapperおよびApplication.call_wrapperのAPIドキュメントを参照してください。

あなたはこれをしたくないですか?サービスクラスまたはアプリケーションにイベントハンドラを追加できます。 events exampleを起動することができます。

まだデコレータを使いたいですか? this FAQ entryを参照してください。関連ビットの引用:

from decorator import decorator 

def _do_something(func, *args, **kw): 
    print "before call" 
    result = func(*args, **kw) 
    print "after call" 
    return result 

def my_decor(f): 
    return decorator(_do_something, f) 

class SomeService(ServiceBase): 
    @my_decor 
    @srpc(Integer, _returns=Integer) 
    def testf(first): 
     return first 

注意事項デコレータの場所ということ。 @srpcの前に置くと、サービスの初期化時に一度実行されます。それを後に置くと、メソッドが呼び出されるたびに実行されますが、初期化では実行されません。

もう一度、デコレータを使用しないでください!

あなたは警告されています:)

関連する問題