Найти - Пользователи
Полная версия: Tornado AsyncHTTPClient исключения
Начало » Network » Tornado AsyncHTTPClient исключения
1
mironich
Как-же их ловить?
Смотрю в книгу вижу фигу..
Не получаеться их ловить.
@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 и.т.д
Но как-же их отлоить, обработать, и что-бы в консоль не сыпались?
Не понятны мне примеры из док-ции.
o7412369815963
AsyncHTTPClient вроде не вызывает исключения, он возвращает переменную error при ошибках.
Можно попробовать запустить все через tornado.gen.Task.

Давайте полный пример, который можно запустить.
mironich
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()
Например, обращение к заведомо неверному домену…
o7412369815963
Добавьте строку в начале:
tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
что-б использовать curl вместо “simple”, у него больше возможностей, хотя я читал, что разработчики хотели в новых версиях сделать его по дефолту. С ним работает нормально.
o7412369815963
Решил попробовать стандартный fetch…
все просто
Пример этот как надо не работает(не ловит исключения),…
Не ловится потому что нет исключения (там варниниг валится, который сбил с толку), вам вернулся error, теперь вы можете сами вызвать исключение если хотите
if response.error: raise Exception(response.error)
, либо можно сделать обертку над AsyncHTTPClient
А вообще в асинхронном коде не удобно работать с исключениями. Если делаете большое приложение то вот на заметку: тут я “поплакал” в эту ветку: http://python.su/forum/topic/20151/
mironich
Не ловится потому что нет исключения (там варниниг валится, который сбил с толку), вам вернулся 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
А исключение сразу после него?
o7412369815963
Нет, исключения нет вообще, иначе “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
mironich
Только сейчас понял что это сообщение logging, дабы не лезли когда не надо.
Убрал так.
tornado.simple_httpclient.logging.basicConfig(level = ERROR)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB