7

Правильный способ использования try/except с модулем requests в Python?

4

Проблема описана ниже:


У меня есть код на Python, который делает HTTP-запрос с использованием библиотеки requests. Я использую следующий фрагмент кода для обработки ошибок подключения:

try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print(e)

Правильно ли я использую конструкцию try-except для обработки исключения ConnectionError? Есть ли более эффективный способ структурировать этот код? Покрывает ли этот подход все возможные проблемы, с которыми я могу столкнуться при выполнении запроса?

Заранее спасибо за помощь!

2 ответ(ов)

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

Подводя итог, рекомендуется сначала обрабатывать более специфичные исключения, чтобы точно идентифицировать и локализовать проблему.

0

В объекте исключения также содержится оригинальный ответ 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, мы можем вывести текст тела ответа от сервера для дальнейшего анализа.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь