2016-07-05 12 views
2

Ich habe ein Problem mit mehreren Dekoratoren mit Spyne. Ich möchte universelle try/except Decorator zu jeder Methode in der Klasse hinzufügen. Mein Code sieht wie folgt aus:Wie mehrere Dekorierer mit Spyne verwenden

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 

Mit @try_except ich Anzahl von Argumenten Fehler bekommen, was mache ich falsch?

+1

Können Sie die Traceback hinzufügen? – obskyr

+0

Beachten Sie, dass Decorators * "inside out" * angewendet werden, so dass jeder Fehler, der aus dem Code im 'rpc'-Wrapper geworfen wird, nicht von' try_except' abgefangen wird – jonrsharpe

Antwort

1

Ich empfehle Dekorateure nicht. Nicht weil sie nicht unterstützt werden, sondern weil sie nicht sehr mächtig sind und auch kryptisches Verhalten haben.

Für die Ausnahmebehandlung können Sie die call_wrapper Funktion von Application oder ServiceBase in einer Klasse in Ihrem Projekt überschreiben und anstelle von Spyne-Klassen verwenden. Sie sollten Ihren Versuch/Ausnahme Block um den super() Anruf haben.

Siehe API-Dokumentation für ServiceBase.call_wrapper und Application.call_wrapper.

Sie möchten dies nicht tun? Sie können Ihren Serviceklassen oder Anwendungen Ereignishandler hinzufügen. Die events example können Sie starten.

Sie wollen immer noch Dekorateure verwenden? Siehe this FAQ entry. Unter Angabe der relevanten Bits:

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 

Beachten Sie, dass die Stelle der Dekorateur Angelegenheiten. Wenn Sie es vor @srpc platzieren, wird es bei der Initialisierung des Dienstes einmal ausgeführt. Wenn Sie es nachstellen, wird es jedes Mal ausgeführt, wenn die Methode aufgerufen wird, aber nicht bei der Initialisierung.

Auch hier keine Dekorateure verwenden !!

Sie wurden gewarnt :)