скрученный Python DeferedList ErrorBack (необработанная ошибка в Deferred) - PullRequest
0 голосов
/ 11 января 2011

В приведенном ниже коде я передаю комбинацию хост: порт и пытаюсь получить некоторую информацию с сервера, используя витую задержкуЯ показал очень простой код того, что я пытаюсь сделать.Соединение с портом хоста осуществляется через httplib.Он работает правильно, если хост включен.Правильные методы обратного вызова вызываются.Но когда происходит сбой (при сбое получения url), он не входит в функцию printError.Я получаю ошибку «Unhandled error in Deferred», и цикл останавливается.Может кто-нибудь, пожалуйста, покажите мне, как я могу избавиться от ошибки.Пожалуйста, предоставьте решение.

import httplib, time, sys

from twisted.internet import reactor, defer, task

from twisted.python import log

class Getter:

    def gotResults(self, x):

        ( host, port ) = x.split(":")
        conn = httplib.HTTPConnection( host, port )

        try :
            conn.request ( 'GET', '/get/data/' )
            response = conn.getresponse()
            self.d.callback ( response )
        except ( httplib.HTTPException ) :
            self.d.errback(ValueError("Error Connecting"))



    def getDummyData(self, x):
        currTime = time.strftime( "%H:%M:%S" )
        print currTime
        self.d = defer.Deferred()
        self.gotResults(x)
        return self.d



def printData(data):

    for d in data:
        print "Results %s %s" % ( str(d[1].status), str(d[1].reason)  )

def printError(data):

    print data



def testmessage():
# this series of callbacks and errbacks will print an error message
    g = Getter()
    deferred1 = g.getDummyData( 'valid_hostname1:port1' )
    # this should go to printData

    g = Getter()
    deferred2 = g.getDummyData('invalid_hostname2:port2')
    # this should go to printError

    d1 = defer.DeferredList ( [ deferred1, deferred2 ] )
    d1.addCallback ( printData )
    d1.addErrback  ( printError )



x = task.LoopingCall ( testmessage )
x.start ( 1 )
reactor.callLater(300, reactor.stop);
reactor.run()

1 Ответ

1 голос
/ 12 января 2011

Проблема в том, что вы предположили, что conn.request (в вашей строке 17) поднимет httplib.HTTPException, но это не тот тип исключения, который он вызывает. Поскольку вы не совсем уверены, какое исключение оно вызовет, я бы порекомендовал вам создать общий оператор except... и извлечь данные исключения из sys.exc_info().

Исправьте это следующим образом:

import httplib, time, sys

from twisted.internet import reactor, defer, task

from twisted.python import log

class Getter:

    def gotResults(self, x):

        ( host, port ) = x.split(":")
        conn = httplib.HTTPConnection( host, port )

        try :
            conn.request ( 'GET', '/get/data/' )
            response = conn.getresponse()
            self.d.callback ( response )
        except:
            self.d.errback(sys.exc_info())


    def getDummyData(self, x):
        currTime = time.strftime( "%H:%M:%S" )
        print currTime
        self.d = defer.Deferred()
        self.gotResults(x)
        return self.d



def printData(data):

    for d in data:
        print "Results %s %s" % ( str(d[1].status), str(d[1].reason)  )

def printError(data):

    print data



def testmessage():
# this series of callbacks and errbacks will print an error message
    g = Getter()
    deferred1 = g.getDummyData( 'valid_hostname1:port1' )
    # this should go to printData

    g = Getter()
    deferred2 = g.getDummyData('invalid_hostname2:port2')
    # this should go to printError

    d1 = defer.DeferredList ( [ deferred1, deferred2 ] )
    d1.addCallback ( printData )
    d1.addErrback  ( printError )



x = task.LoopingCall ( testmessage )
x.start ( 1 )
reactor.callLater(300, reactor.stop);
reactor.run()
...