2014-04-09 2 views
0

Предположим, что у меня есть 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), но это решение выглядит грубым и уродливым.

ответ

0

Я думаю, что ваш единственный вариант, чтобы вытащить его из e.message:

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

На моей платформе (Linux), я на самом деле получить исключение socket.gaierror, когда я беру свой пример кода и использовать фиктивный URL, который обеспечивает прямой доступ к errno. Но если вы имеете дело с tornado.httpclient.HTTPError, я не думаю, что вы можете получить его прямо.

+0

На данный момент (с Tornado 3.2) синтаксический анализ сообщения об ошибках - это лучшее, что вы можете сделать для определенных ошибок, но я попытаюсь исправить это в будущей версии. Обратите внимание, что вам не гарантируется получение HTTPError; когда это будет исправлено, вероятно, это приведет к прямому увеличению IOError. (если вы использовали curl_httpclient вместо simple_httpclient, вместо этого вы получите CurlError) –

+0

Спасибо за ваши ответы – risboo6909

Смежные вопросы