Python 从tornado HTTPClient获取套接字级别错误

Python 从tornado HTTPClient获取套接字级别错误,python,sockets,httpclient,tornado,Python,Sockets,Httpclient,Tornado,假设我的http服务器位于host:port,我正试图使用tornado文档中的HTTPClient示例从该服务器获取一些数据,因此我有一个下面的代码 from tornado import httpclient http_client = httpclient.HTTPClient() try: response = http_client.fetch("http://host:port", connect_timeout=2) print response.body ex

假设我的http服务器位于host:port,我正试图使用tornado文档中的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,但该解决方案看起来粗糙难看。

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

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

在我的Linux平台上,当我以您的代码为例并使用一个伪造的URL时,实际上得到了一个socket.gaierro异常,该URL提供了对errno的直接访问。但是,如果您处理的是tornado.httpclient.HTTPError,我认为您没有任何方法可以直接获得它。

从tornado 3.2开始,解析错误消息是处理某些错误的最佳方法,但我将在将来的版本中尝试修复它。请注意,您不一定会得到HTTPError;修复此问题后,可能会直接引发IOError。如果使用curl\u httpclient而不是simple\u httpclient,则会出现curl错误