2012-07-09 32 views
9

Đây là khách hàng của tôi đơn giản HTTP cho một số api:Xử lý Sự cố trong 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() 

Khi tôi bắt đầu chương trình, tôi bắt lỗi:

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

Nhưng tôi không biết, mà lỗi này đã xảy ra. Tôi có thể biết điều đó bằng cách nào? Tôi đã cố gắng hiển thị truy nguyên cho

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

nhưng tôi không thể nhận được.

+0

Bạn có thể muốn thử "getErrorMessage()" trên trường hợp lỗi để xem nếu nó cung cấp thêm một chút thông tin. – Rakis

+1

Thực tế là bạn nhận được một thông báo lỗi như vậy ở đây là một lỗi trong Twisted. Xem http://twistedmatrix.com/trac/ticket/5310 – Glyph

Trả lời

7

Ví dụ Thất bại đó bao gồm một trường hợp Lỗi khác và không in nhiều thông tin về bên trong. Sự lúng túng này là lỗi của Twisted; lớp twisted.web._newclient._WrapperException lưu trữ thuộc tính reasons, nhưng dường như không quan tâm đến việc in thông tin về những lý do đó theo phương pháp __str__ của nó.

Bạn có thể thấy phần còn lại của vấn đề của bạn nếu bạn thêm một dòng khác để cbError() chức năng của bạn:

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

tôi có thể sao chép các lỗi ở đây, và với các thông tin thêm nó rõ ràng rằng tham số thứ tư của bạn để Agent.request() được coi là nhà cung cấp IBodyProducer, nhưng thay vào đó, bạn đang chuyển một chuỗi trống. Hãy thử xóa tham số cuối cùng đó.

+0

Cảm ơn bạn. Nó thực sự là giúp :) – user1511311

2

Câu trả lời của-paul ở trên là chính xác. Tôi muốn cung cấp chức năng ngắn này mà tôi thấy hữu ích trong việc làm phẳng các Thất bại, nhưng tôi không thể đưa nó vào một nhận xét:

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 
Các vấn đề liên quan