2012-07-09 3 views
9

Dies ist mein einfaches HTTP-Client für einige api:Fehlerbehandlung in Twisted-

# -*- coding: utf-8 -*- 
import settings 
from twisted.internet import reactor 
from twisted.web.client import Agent 
from twisted.web.http_headers import Headers 

params = { 
    'url': 'http://api.vk.com/api.php', 
    'id':260, 
    } 


def params_for_get(): 
    return '&'.join(["%s=%s" % (key,val) for key, val in params.items()]) 


agent = Agent(reactor) 
d = agent.request(
    'GET', 
    "%s?%s" % (settings.APPLICATION_URL, params_for_get()), 
    Headers({'User-Agent': ['Twisted Web Client Example'], 
      'Content-Type': ['text/x-greeting']}), 
    '') 

def cbResponse(*args, **kwargs): 
    print args, kwargs 
    print 'Response received' 


def cbShutdown(ignored): 
    reactor.stop() 

def cbError(failure): 
    print type(failure.value), failure # catch error here 


d.addCallbacks(cbResponse, cbError) 
d.addBoth(cbShutdown) 


reactor.run() 

Als ich Programm starten, ertappe ich Fehler:

<class 'twisted.web._newclient.RequestGenerationFailed'> [Failure instance: Traceback (failure with no frames): <class 'twisted.web._newclient.RequestGenerationFailed'>: [<twisted.python.failure.Failure <type 'exceptions.AttributeError'>>] 
] 

Aber ich weiß nicht, wo dieser Fehler passiert. Wie kann ich es wissen? Ich habe versucht, Zurückverfolgungs anzuzeigen für

<twisted.python.failure.Failure <type 'exceptions.AttributeError'>> 

aber ich konnte nicht.

+0

Sie mögen „getErrorMessage()“ auf dem Scheitern Instanz, um zu versuchen, um zu sehen wenn es ein bisschen mehr Informationen liefert. – Rakis

+1

Die Tatsache, dass Sie hier eine solche kränkliche Fehlermeldung erhalten, ist ein Fehler in Twisted. Siehe http://twistedmatrix.com/trac/ticket/5310 – Glyph

Antwort

7

Diese fehlgeschlagene Instanz umschließt eine weitere Fehlerinstanz und druckt nicht viele Informationen über die darin enthaltene Instanz. Diese Ungeschicklichkeit ist Twisteds Schuld; Die twisted.web._newclient._WrapperException-Klasse speichert ein reasons-Attribut, scheint sich jedoch nicht darum zu kümmern, Informationen über diese Gründe in ihrer __str__-Methode zu drucken.

Sie könnten den Rest Ihres Problems sehen, wenn Sie eine andere Zeile in cbError() Funktion hinzu:

failure.value.reasons[0].printTraceback() 

ich hier den Fehler reproduzieren kann, und mit den zusätzlichen Informationen ist es offensichtlich, dass Ihr vierte Parameter zu Agent.request() sollte ein IBodyProducer Provider sein, aber Sie übergeben stattdessen eine leere Zeichenfolge. Versuchen Sie, diesen letzten Parameter zu entfernen.

+0

Vielen Dank. Es ist wirklich geholfen :) – user1511311

2

Die Antwort von the-paul oben ist korrekt. Ich wollte diese kurze Funktion zur Verfügung zu stellen, dass ich die Fehler, die in Verflachung gefunden, aber ich konnte es nicht in einem Kommentar setzen:

def unwrap_failures(err): 
    """ 
    Takes nested failures and flattens the nodes into a list. 
    The branches are discarded. 
    """ 
    errs = [] 
    check_unwrap = [err] 
    while len(check_unwrap) > 0: 
     err = check_unwrap.pop() 
     if hasattr(err.value, 'reasons'): 
      errs.extend(err.value.reasons) 
      check_unwrap.extend(err.value.reasons) 
     else: 
      errs.append(err) 
    return errs