从tornado HTTPClient获取套接字级错误

时间:2014-04-09 15:41:56

标签: python sockets httpclient tornado

假设我的http服务器位于(host:port),我正在尝试使用龙卷风文档中的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)中获取它,但此解决方案看起来很粗糙,难看。

1 个答案:

答案 0 :(得分:0)

我认为你唯一的选择就是把它从e.message中拉出来:

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

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