假设我的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)中获取它,但此解决方案看起来很粗糙,难看。
答案 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,我认为没有任何方法可以直接获得它。