我遇到多个spyne装饰器的问题。我想在类中为每个方法添加通用try / except装饰器。我的代码如下所示:
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我得到的参数数量错误,我做错了什么?
答案 0 :(得分:1)
我不推荐装饰师。不是因为它们不受支持,而是因为它们不是很强大而且也有神秘的行为。
对于异常处理,您可以覆盖项目中类的call_wrapper
或Application
的{{1}}函数,并使用它而不是库存Spyne类。您应该将{try / except块围绕ServiceBase
来电。
请参阅ServiceBase.call_wrapper和Application.call_wrapper的API文档。
你不喜欢这样做吗?您可以向服务类或应用程序添加事件处理程序。 events example可以帮助您入门。您还想使用装饰器吗?见this FAQ entry。引用相关位:
super()
请注意,装饰者的位置很重要。将它放在@srpc之前会使它在服务初始化时运行一次。将它放在后面将使它在每次调用方法时运行,而不是在初始化时运行。
再次,不要使用装饰者!!
你被警告过:)