Как мне поймать конкретную ошибку HTTP в Python?

у меня есть

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:
   <whatever>

но в итоге я ловлю любую ошибку HTTP. Я хочу поймать, только если указанная веб-страница не существует (404?).


person Arnab Sen Gupta    schedule 07.07.2010    source источник
comment
Пробовали рецепт из этого поста? stackoverflow.com/ вопросы/1308542/   -  person John P    schedule 07.07.2010


Ответы (3)


Питон 3

from urllib.error import HTTPError

Питон 2

from urllib2 import HTTPError

Просто поймайте HTTPError, обработайте ее, и если это не ошибка 404, просто используйте raise, чтобы повторно вызвать исключение.

См. руководство по Python.

например полный пример для Pyhton 2

import urllib2
from urllib2 import HTTPError
try:
   urllib2.urlopen("some url")
except HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise
person Tim Pietzcker    schedule 07.07.2010
comment
Привет!! это работает как шарм!! Я не думал о трюке с рейзом!! Большое спасибо!! - person Arnab Sen Gupta; 07.07.2010
comment
Могу ли я сделать urllib2.urlopen(*) для обработки любых ошибок 404 и перенаправить их на мою страницу 404.html? - person ; 01.10.2015
comment
@TobiasKolb: Поскольку вопрос помечен urllib2 (в конце концов, ему больше 9 лет) и urllib3 не входит в стандартную библиотеку, я думаю, что он здесь не подходит. Если дубликата уже нет, может быть, открыть новый вопрос? Или используйте urllib, как указано в ответе Лазика ниже. - person Tim Pietzcker; 29.10.2019
comment
Я пишу регрессионные тесты, поэтому мне нужен доступ к ответу urlopen, даже если это 404. Даже если я назначу значение из urllib2.urlopen("some url") , я не смогу использовать это значение внутри исключения — это вызовет другое исключение. Итак, как мне получить ответный текст страницы 404, которая была возвращена? - person TaiwanGrapefruitTea; 10.07.2021
comment
Я нашел ответ: вы можете использовать экземпляр HTTPError в качестве ответа. https://docs.python.org/3/howto/urllib2.html#httperror - person TaiwanGrapefruitTea; 10.07.2021

Для Python 3.x

import urllib.request
from urllib.error import HTTPError
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)
person Lazik    schedule 04.10.2013
comment
Использование except urllib.error.HTTPError as err: без использования команды импорта исправляет catching classes that do not inherit from BaseException is not allowed httperror причудливым образом. - person Abhijeet; 21.02.2017
comment
@abhjeet решил эту проблему, добавив from urllib.error import HTTPError. Я отредактировал сообщение. - person felice; 12.11.2019
comment
urllib.request.urlretrieve() — это устаревший интерфейс Python 2. . . docs.python.org/3/library/urllib.request. html#устаревший интерфейс - person TaiwanGrapefruitTea; 10.07.2021

ответ Тима кажется мне вводящим в заблуждение, особенно когда urllib2 не возвращает ожидаемый код. Например, эта ошибка будет фатальной (верите или нет, но это не редкость при загрузке URL):

AttributeError: объект «URLError» не имеет атрибута «код»

Быстрым, но, возможно, не лучшим решением будет код, использующий вложенный блок try/except:

import urllib2
try:
    urllib2.urlopen("some url")
except urllib2.HTTPError as err:
    try:
        if err.code == 404:
            # Handle the error
        else:
            raise
    except:
        ...

Дополнительная информация по теме вложенных блоков try/except Являются ли вложенные блоки try/except в Python хорошей практикой программирования?

person sonavolob    schedule 19.05.2015