Как отловить исключение в закрученном обратном вызове? - PullRequest
2 голосов
/ 28 октября 2011
    from twisted.internet import reactor, defer

def getDummyData(x):
    """
    This function is a dummy which simulates a delayed result and
    returns a Deferred which will fire with that result. Don't try too
    hard to understand this.
    """
    d = defer.Deferred()
    # simulate a delayed result by asking the reactor to fire the
    # Deferred in 2 seconds time with the result x * 3
    reactor.callLater(2, d.callback, x * 3)
    return d

def printData(d):
    """
    Data handling function to be added as a callback: handles the
    data by printing the result
    """
    raise ValueError('IIIGGAA')
    print d

def nextCall(d):
    import pdb; pdb.set_trace()
d = getDummyData(3)

d.addErrback(nextCall).addCallback(printData).addErrback(nextCall).addCallback(nextCall)


# manually set up the end of the process by asking the reactor to
# stop itself in 4 seconds time
reactor.callLater(1, reactor.stop)
# start up the Twisted reactor (event loop handler) manually
reactor.run()

функция nextCall - никогда не вызывает. Так где я могу найти свою ValueError?

Спасибо.

1 Ответ

4 голосов
/ 28 октября 2011

Он никогда не вызывается, потому что код под вашим комментарием, в котором говорится, что реактор останавливается через 4 секунд, на самом деле просит реактор остановить себя через 1 секунду. 2-секундный callLater никогда не вызывается, поэтому d никогда не запускается, поэтому nextCall никогда не вызывается.

Может быть, вам следует попытаться построить этот пример без использования реактора, просто вызвав callback синхронно с соответствующим отложенным режимом? Вам не нужен реактор, чтобы запустить простой Deferred, и синхронная работа с ними может помочь вам получить более точное представление о том, что именно происходит, когда

...