2012-07-09 6 views
9

Questa è la mia semplice client HTTP per qualche api:Manipolazione Fallimento in ritorto

# -*- 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() 

Quando inizio programma, ho cattura di errore:

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

Ma non so dove questo errore è accaduto. Come posso saperlo? Ho cercato di visualizzare traceback per

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

ma non ho potuto ottenere.

+0

Si consiglia di provare "GetErrorMessage()" a l'istanza fallimento per vedere se fornisce un po 'più di informazioni. – Rakis

+1

Il fatto che tu abbia ricevuto un messaggio di errore così scadente è un bug in Twisted. Vedi http://twistedmatrix.com/trac/ticket/5310 – Glyph

risposta

7

Questa istanza di Failure sta eseguendo il wrapping di un'altra istanza di Failure e non sta stampando molte informazioni su quella interna. Questo imbarazzo è colpa di Twisted; la classe twisted.web._newclient._WrapperException memorizza un attributo reasons, ma non sembra preoccuparsi di stampare informazioni su tali motivi nel suo metodo __str__.

Si poteva vedere il resto del problema se si aggiunge un'altra riga al) Funzione cbError (:

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

posso riprodurre l'errore qui, e con le informazioni extra è evidente che il quarto parametro a Agent.request() dovrebbe essere un provider IBodyProducer, ma stai passando una stringa vuota. Prova a rimuovere l'ultimo parametro.

+0

Grazie. E 'davvero aiutato :) – user1511311

2

La risposta di cui sopra è corretta. Ho voluto fornire questo breve funzione che ho trovato utile in appiattimento dei fallimenti, ma non riuscivo a metterlo in un commento:

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