从Tornado HTTPClient获取套接字级错误

0 投票
1 回答
1028 浏览
提问于 2025-04-18 02:03

假设我有一个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),但这个方法看起来很粗糙,不太好。

1 个回答

0

我觉得你唯一的办法就是从 e.message 中提取信息:

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

在我的平台(Linux)上,当我用你提供的代码示例并输入一个错误的 URL 时,实际上会出现一个 socket.gaierror 的异常,这样我就可以直接访问错误代码了。但是如果你遇到的是 tornado.httpclient.HTTPError,我觉得你没有办法直接获取到这个错误信息。

撰写回答