поймать конкретную ошибку HTTP в Python - PullRequest
60 голосов
/ 07 июля 2010

Я хочу поймать определенную ошибку http, а не кого-либо из всей семьи ... я пытался сделать это -

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

, но в итоге я ловлю httpошибка, но я хочу поймать только если указанная веб-страница не существует!вероятно, это ошибка HTTP 404 .. но я не знаю, как указать, что ошибка 404 только для перехвата и позволить системе запускать обработчик по умолчанию для других событий .. никаких предложений ??

Ответы [ 3 ]

105 голосов
/ 07 июля 2010

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

См. Учебник Python .

Чтобы вы могли сделать:

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise
36 голосов
/ 04 октября 2013

Для Python 3.x

import urllib.request
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)
3 голосов
/ 19 мая 2015

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

AttributeError: у объекта 'URLError' нет атрибута 'code'

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

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

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

...