2016-07-05 49 views
2

我遇到了spyne多個裝飾器的問題。我想爲類中的每個方法添加通用嘗試/裝飾器除外。我的代碼如下所示:如何與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 

隨着@try_except我得到的參數錯誤的號碼,我究竟做錯了什麼?

+1

你可以添加回溯? – obskyr

+0

請注意,裝飾器被應用*「從裏到外」*,因此從'rpc'包裝器中的代碼拋出的任何錯誤都不會被'try_except' – jonrsharpe

回答

1

我不推薦裝修。不是因爲他們不被支持,而是因爲他們不是很強大,也有隱晦的行爲。

對於異常處理,您可以在項目的類中覆蓋ApplicationServiceBasecall_wrapper函數,並使用它代替股票Spyne類。你應該有圍繞super()調用的try/except塊。

查看ServiceBase.call_wrapperApplication.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之前會使其在服務初始化時運行一次。把它放在後面會使它在每次調用方法時運行,但不會在初始化時運行。

再次,不要使用裝飾者!

你已被警告:)

相關問題