Правильный способ использования try/except с модулем requests в Python?
Проблема описана ниже:
У меня есть код на Python, который делает HTTP-запрос с использованием библиотеки requests
. Я использую следующий фрагмент кода для обработки ошибок подключения:
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print(e)
Правильно ли я использую конструкцию try-except
для обработки исключения ConnectionError
? Есть ли более эффективный способ структурировать этот код? Покрывает ли этот подход все возможные проблемы, с которыми я могу столкнуться при выполнении запроса?
Заранее спасибо за помощь!
2 ответ(ов)
При обработке исключений в Python важно соблюдать порядок, чтобы более специфичные исключения обрабатывались раньше общих. Это поможет избежать "маскировки" специфичных ошибок общими, что может привести к неправильным трактовкам ошибок и затруднениям в их диагностике.
В вашем примере кода, в первом варианте вы правильно сначала обрабатываете специфичные ошибки, такие как HTTPError
, ConnectionError
, и Timeout
. Это позволяет вам точно знать, с какой проблемой вы столкнулись:
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("OOps: Something Else", err)
# Пример вывода: Http Error: 404 Client Error: Not Found for url: http://www.google.com/blahblah
Во втором варианте кода вы сначала пытаетесь поймать общее исключение RequestException
, что приводит к тому, что все остальные специфичные исключения будут "пойманы" здесь, и вы не сможете увидеть точную информацию о том, что именно пошло не так:
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.RequestException as err:
print("OOps: Something Else", err)
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
# Пример вывода: OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah
Подводя итог, рекомендуется сначала обрабатывать более специфичные исключения, чтобы точно идентифицировать и локализовать проблему.
В объекте исключения также содержится оригинальный ответ e.response
, который может быть полезен, если вам нужно увидеть тело ошибки в ответе от сервера. Например:
try:
r = requests.post('somerestapi.com/post-here', data={'birthday': '9/9/3999'})
r.raise_for_status()
except requests.exceptions.HTTPError as e:
print(e.response.text)
В этом примере, если при выполнении POST-запроса произойдет ошибка HTTP, мы можем вывести текст тела ответа от сервера для дальнейшего анализа.
Вручную вызов (бросание) исключения в Python
Поймать и вывести полный трейсбек исключения в Python без остановки/выхода из программы
Как напечатать исключение в Python?
Как проверить, существует ли переменная?
Как протестировать, что функция Python вызывает исключение?