Обработка исключений в Pornon Tornado

Я пытаюсь обработать исключение, произошедшее в AsyncClient.fetch следующим образом:

 from tornado.httpclient import AsyncHTTPClient from tornado.httpclient import HTTPRequest from tornado.stack_context import ExceptionStackContext from tornado import ioloop def handle_exc(*args): print('Exception occured') return True def handle_request(response): print('Handle request') http_client = AsyncHTTPClient() with ExceptionStackContext(handle_exc): http_client.fetch('http://some123site.com', handle_request) ioloop.IOLoop.instance().start() 

и см. следующий вывод:

 WARNING:root:uncaught exception Traceback (most recent call last): File "/home/crchemist/python-3.2/lib/python3.2/site-packages/tornado-2.0-py3.2.egg/tornado/simple_httpclient.py", line 259, in cleanup yield File "/home/crchemist/python-3.2/lib/python3.2/site-packages/tornado-2.0-py3.2.egg/tornado/simple_httpclient.py", line 162, in __init__ 0, 0) socket.gaierror: [Errno -5] No address associated with hostname Handle request 

Что я делаю не так?

  • Цвет линии 3D-параметрической кривой в matplotlib.pyplot на python
  • Python Socket Flush
  • Чтение огромного файла .csv
  • Установка шипов в matplotlibrc
  • Ограничение доступа к приватным загрузкам файлов в Django
  • Python разделяет строки и смешивает средние
  • Python: изменение имени процесса с помощью setproctitle
  • auto.arima () эквивалент для python
  • 2 Solutions collect form web for “Обработка исключений в Pornon Tornado”

    Согласно документации Tornado :

    Если во время выборки возникает ошибка, HTTPResponse, заданный для обратного вызова, имеет атрибут ошибки, отличный от None, который содержит исключение, возникшее во время запроса. Вы можете вызвать response.rethrow() чтобы вызвать исключение (если оно есть) в обратном вызове.

     from tornado.httpclient import AsyncHTTPClient from tornado.httpclient import HTTPRequest from tornado.stack_context import ExceptionStackContext from tornado import ioloop import traceback def handle_exc(*args): print('Exception occured') return True def handle_request(response): if response.error is not None: with ExceptionStackContext(handle_exc): response.rethrow() else: print('Handle request') http_client = AsyncHTTPClient() http_client.fetch('http://some123site.com', handle_request) http_client.fetch('http://google.com', handle_request) ioloop.IOLoop.instance().start() 

    Сообщение, которое вы видите на консоли, является только предупреждением (отправляется через logging.warning ). Это безобидно, но если это вас действительно беспокоит, см. Модуль регистрации для того, как его фильтровать.

    Я вообще не знаю Tornado, но я посмотрел, и вы просто не можете поймать исключения таким образом. Исключение генерируется в конструкторе _HTTPConnection (), и большая часть кода в этом конструкторе уже обернута другим стеком:

      with stack_context.StackContext(self.cleanup): parsed = urlparse.urlsplit(_unicode(self.request.url)) [...] 

    Таким образом, в основном, когда генерируется исключение (gaierror в вашем примере), он уже пойман и обрабатывается через self.cleanup, что по очереди генерирует ответ 599 AFAICT:

     @contextlib.contextmanager def cleanup(self): try: yield except Exception, e: logging.warning("uncaught exception", exc_info=True) self._run_callback(HTTPResponse(self.request, 599, error=e, request_time=time.time() - self.start_time, )) 

    Не уверен, ответит ли этот вопрос на ваш вопрос.

    Interesting Posts
    Python - лучший язык программирования в мире.