2016-06-06 19 views
0

Ich habe eine Callback-Kette mit einem Fehler am Ende. Wenn einer der Rückrufe fehlschlägt, muss ich ein Objekt übergeben, das auf errBack verwendet werden soll.Wie übergebe ich ein Objekt vom Rückruf zum Fehler (verdreht)?

Wie kann ich ein Objekt vom Rückruf an den Fehler übergeben?

Der folgende Code veranschaulicht, was ich tun möchte:

from twisted.internet.defer import FAILURE 
from twisted.internet import defer 


class CodMsg(object): 
    def __init__(self, code, msg): 
     self.code = code 
     self.msg = msg 

class Resource(object): 

    @classmethod 
    def checkCondition(cls, result): 
     if result == "error": 
      cdm = CodMsg(1, 'Error 1') 
      raise FAILURE, cdm 
     else: 
      return "ok" 

    @classmethod 
    def erBackTst (cls, result): 

     ####### How to get the value of cdm here? ######## <<<=== 
     print 'Error:' 
     print result 
     return result 


d = defer.Deferred() 

d.addCallback(Resource.checkCondition) 


d.addErrback(Resource.erBackTst) 

d.callback("error") 

print d.result 

Antwort

1

In diesem Fall können Sie nur eine Ausnahme auslösen, enthält alle Informationen, die Sie

Zum Beispiel benötigen:

from twisted.internet import defer 

class MyCustomException(Exception): 
    def __init__(self, msg, code): 
     self.code = code 
     self.message = msg 

def callback(result): 
    print result 
    raise MyCustomException('Message', 23) 

def errback(failure): 
    # failure.value is an exception instance that you raised in callback 
    print failure.value.message 
    print failure.value.code 

d = defer.Deferred() 
d.addCallback(callback) 
d.addErrback(errback) 

d.callback("error") 

Auch für besseres Verständnis und asynchrone Programmierung können Sie dieses nette verdrehte Tutorial http://krondo.com/an-introduction-to-asynchronous-programming-and-twisted/ lesen. Es verwendet ein wenig veraltete verdrehte Version in Beispielen, aber es ist immer noch eine ausgezeichnete Quelle, um zu lernen, verdreht

+0

Excelent. Funktioniert gut. Danke @Evgeny Barbashov –