2014-04-09 22 views
0

假设我有位于(host:port)的http服务器,并且我试图使用tornado文档中的HTTPClient示例从该服务器获取一些数据,所以我在下面有一个代码获取来自龙卷风的套接字级错误HTTPClient

from tornado import httpclient 

http_client = httpclient.HTTPClient() 
try: 
    response = http_client.fetch("http://host:port", connect_timeout=2) 
    print response.body 

except httpclient.HTTPError as e: 
    print e.code 
    print e.message 

http_client.close() 

这工作正常,并且如果一切顺利的话(主机可用,服务器工作正常等),我的客户成功地从服务器接收数据。现在我想处理连接过程中可能发生的错误,并根据错误代码处理它们。我试图通过在我的异常处理程序中使用e.code来获取错误代码,但它只包含HTTP错误代码,并且我需要一些较低级别的错误代码,例如:

1)如果服务器无法在目的地主机和端口它打印出

599 
HTTP 599: [Errno 111] Connection refused 

2)如果它是不可能达到的主机(例如,由于网络连接问题),我收到相同的HTTP 599错误代码:

599 
HTTP 599: [Errno 101] Connection refused 

所以我需要在我的异常处理程序中获取Errno,它会显示实际的值更水平的套接字错误,我现在看到的唯一解决方案是从我收到的文本消息(e.message)中grep它,但这个解决方案看起来粗糙和丑陋。

回答

0

我认为你唯一的选择是将其拉出e.message的:

import re 
m = re.search("\[Errno (\d+)\]", e.message) 
if m: 
    errno = m.group(1) 

在我的平台(Linux)的,其实我得到一个socket.gaierror异常,当我把你的代码示例和使用伪造的URL,它提供了对errno的直接访问。但是,如果你正在处理tornado.httpclient.HTTPError,我不认为你有任何直接获取它的方法。

+0

现在(从Tornado 3.2开始)解析错误信息是对某些错误可以做的最好的,但我会尝试在未来的版本中解决这个问题。请注意,您不能保证获得HTTPError;当这是固定的,它可能会直接引发IOError。 (如果你使用的是curl_httpclient而不是simple_httpclient,你会得到一个CurlError) –

+0

感谢你的回答 – risboo6909