Предположим, что у меня есть http-сервер, расположенный в (хост: порт), и я пытаюсь использовать пример 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 в моем обработчике исключений, который будет указывать на фактическое более низкое и единственное решение, которое я вижу сейчас, - это grep его из текстового сообщения, которое я получаю (e.message), но это решение выглядит грубым и уродливым.
На данный момент (с Tornado 3.2) синтаксический анализ сообщения об ошибках - это лучшее, что вы можете сделать для определенных ошибок, но я попытаюсь исправить это в будущей версии. Обратите внимание, что вам не гарантируется получение HTTPError; когда это будет исправлено, вероятно, это приведет к прямому увеличению IOError. (если вы использовали curl_httpclient вместо simple_httpclient, вместо этого вы получите CurlError) –
Спасибо за ваши ответы – risboo6909