Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 25, 2013 01:52:30

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

Как-же их ловить?
Смотрю в книгу вижу фигу..
Не получаеться их ловить.

@contextlib.contextmanager
def die_on_error():
    try:
        yield
    except Exception:
        logging.error("exception in asynchronous operation",exc_info=True)
        sys.exit(1)
with StackContext(die_on_error):
    # Any exception thrown here *or in callback and its desendents*
    # will cause the process to exit instead of spinning endlessly
    # in the ioloop.
    http_client.fetch(url, callback)
ioloop.start()
Пример этот как надо не работает(не ловит исключения),…
Все идет в консоль, ошибки такие:
AttributeError: 'NoneType' object has no attribute 'do_handshake'
HTTPError: HTTP 599: [Errno 111] Connection refused
Ну возникают они при подкл. к недоступному ip и.т.д
Но как-же их отлоить, обработать, и что-бы в консоль не сыпались?
Не понятны мне примеры из док-ции.



Офлайн

#2 Янв. 25, 2013 08:19:34

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

AsyncHTTPClient вроде не вызывает исключения, он возвращает переменную error при ошибках.
Можно попробовать запустить все через tornado.gen.Task.

Давайте полный пример, который можно запустить.

Офлайн

#3 Янв. 25, 2013 12:22:26

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

import tornado.ioloop
import tornado.httpclient
def handle_request(response):
    if response.error:
        print "Error:", response.error
    else:
        print response.body
    tornado.ioloop.IOLoop.instance().stop()
http_client = tornado.httpclient.AsyncHTTPClient()
http_client.fetch("http://www.hjohj.com/", handle_request)
tornado.ioloop.IOLoop.instance().start()
Например, обращение к заведомо неверному домену…



Офлайн

#4 Янв. 26, 2013 10:56:29

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

Добавьте строку в начале:

tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
что-б использовать curl вместо “simple”, у него больше возможностей, хотя я читал, что разработчики хотели в новых версиях сделать его по дефолту. С ним работает нормально.

Офлайн

#5 Янв. 26, 2013 11:34:47

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

Решил попробовать стандартный fetch…
все просто

Пример этот как надо не работает(не ловит исключения),…
Не ловится потому что нет исключения (там варниниг валится, который сбил с толку), вам вернулся error, теперь вы можете сами вызвать исключение если хотите
if response.error: raise Exception(response.error)
, либо можно сделать обертку над AsyncHTTPClient
А вообще в асинхронном коде не удобно работать с исключениями. Если делаете большое приложение то вот на заметку: тут я “поплакал” в эту ветку: http://python.su/forum/topic/20151/

Отредактировано o7412369815963 (Янв. 26, 2013 11:35:31)

Офлайн

#6 Янв. 26, 2013 12:19:55

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

Не ловится потому что нет исключения (там варниниг валится, который сбил с толку), вам вернулся error, теперь вы можете сами вызвать исключение если хотите
Warning как я понимаю это.
WARNING:root:uncaught exception
Traceback (most recent call last):
File “/usr/local/lib/python2.7/dist-packages/tornado/simple_httpclient.py”, line 318, in cleanup
yield
File “/usr/local/lib/python2.7/dist-packages/tornado/simple_httpclient.py”, line 174, in __init__
0, 0)
gaierror: No address associated with hostname
А исключение сразу после него?



Офлайн

#7 Янв. 26, 2013 23:28:14

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

Нет, исключения нет вообще, иначе “hello” и “finish” не вывелось бы:

import tornado.ioloop
import tornado.httpclient
def handle_request(response):
    if response.error:
        print "Error:", response.error
    else:
        print response.body
    print 'hello'
    tornado.ioloop.IOLoop.instance().stop()
http_client = tornado.httpclient.AsyncHTTPClient()
http_client.fetch("http://www.hjohj.com/", handle_request)
tornado.ioloop.IOLoop.instance().start()
print 'finish'
Результат
WARNING:root:uncaught exception
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado/simple_httpclient.py", line 318, in cleanup
    yield
  File "/usr/local/lib/python2.7/dist-packages/tornado/simple_httpclient.py", line 174, in __init__
    0, 0)
gaierror: [Errno -5] No address associated with hostname
Error: [Errno -5] No address associated with hostname
hello
finish

Офлайн

#8 Янв. 28, 2013 02:14:00

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Tornado AsyncHTTPClient исключения

Только сейчас понял что это сообщение logging, дабы не лезли когда не надо.
Убрал так.

tornado.simple_httpclient.logging.basicConfig(level = ERROR)



Отредактировано mironich (Янв. 28, 2013 02:14:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version