Почему urllib2.urlopen () Python вызывает ошибку HTTPError для успешных кодов состояния?

Согласно документации urllib2 ,

Поскольку обработчики по умолчанию обрабатывают перенаправления (коды в диапазоне 300) и коды в диапазоне 100–299 означает успех, обычно вы увидите только коды ошибок в диапазоне 400–599.

И все же следующий код

request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)

вызывает ошибку HTTPError с кодом 201 (создан):

ERROR    2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created

Итак, почему urllib2 бросает HTTPError в этот успешный запрос?

Это не так уж больно; Я могу легко расширить код до:

try:
    request = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(request)
except HTTPError, e:
    if e.code == 201:
        # success! :)
    else:
        # fail! :(
else:
    # when will this happen...?

Но это не похоже на предполагаемое поведение, исходя из документации и того факта, что я не могу найти аналогичные вопросы об этом странном поведении.

Кроме того, чего ожидать блоку else ? Если все успешные коды состояния интерпретируются как HTTPError s, тогда когда urllib2.urlopen () просто возвращает нормальный объект ответа в виде файла, как и вся документация urllib2 ?

17
задан rubergly 11 August 2011 в 21:42
поделиться