у меня есть
import urllib2
try:
urllib2.urlopen("some url")
except urllib2.HTTPError:
<whatever>
но в итоге я ловлю любую ошибку HTTP. Я хочу поймать, только если указанная веб-страница не существует (404?).
у меня есть
import urllib2
try:
urllib2.urlopen("some url")
except urllib2.HTTPError:
<whatever>
но в итоге я ловлю любую ошибку HTTP. Я хочу поймать, только если указанная веб-страница не существует (404?).
Питон 3
from urllib.error import HTTPError
Питон 2
from urllib2 import HTTPError
Просто поймайте HTTPError
, обработайте ее, и если это не ошибка 404, просто используйте raise
, чтобы повторно вызвать исключение.
например полный пример для Pyhton 2
import urllib2
from urllib2 import HTTPError
try:
urllib2.urlopen("some url")
except HTTPError as err:
if err.code == 404:
<whatever>
else:
raise
urllib2
(в конце концов, ему больше 9 лет) и urllib3
не входит в стандартную библиотеку, я думаю, что он здесь не подходит. Если дубликата уже нет, может быть, открыть новый вопрос? Или используйте urllib
, как указано в ответе Лазика ниже.
- person Tim Pietzcker; 29.10.2019
urllib2.urlopen("some url")
, я не смогу использовать это значение внутри исключения — это вызовет другое исключение. Итак, как мне получить ответный текст страницы 404, которая была возвращена?
- 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)
except urllib.error.HTTPError as err:
без использования команды импорта исправляет catching classes that do not inherit from BaseException is not allowed httperror
причудливым образом.
- person Abhijeet; 21.02.2017
from urllib.error import HTTPError
. Я отредактировал сообщение.
- person felice; 12.11.2019
ответ Тима кажется мне вводящим в заблуждение, особенно когда 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 хорошей практикой программирования?