Подтвердить что ты не робот

Улавливать определенную ошибку HTTP в python

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

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

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

4b9b3361

Ответ 1

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

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

Итак, вы можете сделать:

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise

Ответ 2

Для Python 3.x

import urllib.request
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)

Ответ 3

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

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

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

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

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