2016-07-05 4 views
2

У меня проблема с несколькими декораторами со спайном. Я хочу добавить универсальный try/except decorator к каждому методу в классе. Мой код выглядит следующим образом:Как использовать несколько декораторов со спайном

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

Я не рекомендую декораторы. Не потому, что они не поддерживаются, а потому, что они не очень мощные, а также имеют критическое поведение.

Для обработки исключений вы можете переопределить call_wrapper либо Application, либо ServiceBase в классе вашего проекта и использовать его вместо классов Spyne. Вам нужно, чтобы ваш try/except block окружал вызов super().

См. Документы API для ServiceBase.call_wrapper и Application.call_wrapper.

Вам не нравится это делать? Вы можете добавить обработчики событий в свои классы обслуживания или приложения. 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, чтобы он запускался один раз, при инициализации службы. Помещение его после запуска будет выполняться каждый раз при вызове метода, но не при инициализации.

Опять же, не используйте декораторы!

Вы были предупреждены: