.. _errors:

==================================
Обработка сетевых ошибок, таймауты
==================================

Сетевые ошибки
==============

Если в результате сетевого запроса происходит ошибка, Grab генерирует :class:`~grab.error.GrabNetworkError` исключение. Что такое сетевая ошибка? Сервер может вообще не устанавливать соединение по нашему запросу или он может вернуть HTTP-ответ с кодом отличным от 2** (см `Статусы HTTP ответа <http://en.wikipedia.org/wiki/List_of_HTTP_status_codes>`_). Любой запрос с кодом отличным от 2** или 404 считается ошибкой и генерируется :class:`~grab.error.GrabNetworkError` исключение. Нужно ли считать 404 ошибкой - спорный вопрос. Мне удобнее обрабатывать этот случай как нормальный ответ сервера. Возможно, нужна опция, устанавливающая какие коды ответа считать неошибочными.

Таймауты
========

Вы можете настроить максимальное время ожидания начала передачи данных от сервера опцией :ref:`option_connect_timeout` и максимальное время на весь процесс отправки запроса-прёма данных опцией :ref:`option_timeout`.

В случае превышение заданного времени, будет сгенерировано :class:`~grab.error.GrabTimeoutError` исключение.

.. _hammer_mode:

Режим повторных запросов
========================

В случае активации опции :ref:`option_hammer_mode` Grab переключается в режим повторной отсылки того же запроса в случае сетевой ошибки. Количество повторных запросов и их таймауты настраиваются опцией :ref:`option_hammer_timeouts`. Рассмотрим пример::

    g.setup(hammer_mode=True, hammer_timeouts=((2, 5), (10, 15), (20, 30)))
    g.go('http://some/url')

Это значит, что первый сетевой запрос будет произведён с настройками `connect_timeout=2, timeout=5`. В случае timeout-ошибки или получения ответа с кодом отличным от успешного (см. обработка сетевых ошибок), запрос будет произведён ещё раз, но на этот раз с настройками `connect_timeout=10, timeout=15`. Если повторный запрос окончится неудачей будет проивзденё последний третий запрос с натройками `connect_timeout=20, timeout=30`. Надеюсь, вы поняли принцип.
