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

try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print e #should I also sys.exit(1) after this?

Это правильно? Есть ли лучший способ структурировать это? Будет ли это охватывать все мои базы?

Ответ 1

Посмотрите на запросы исключающие документы. Короче говоря:

В случае проблемы с сетью (например, сбой DNS, отказ соединения и т.д.) запросы будут вызывать исключение ConnectionError.

В случае редкого недействительного HTTP-запроса запросы будут поднять исключение HTTPError.

Если запрос истекает, возникает исключение Timeout.

Если запрос превышает настроенное количество максимальных перенаправлений, возникает исключение TooManyRedirects.

Все исключения, которые явно запрашивают запросы, наследуют от requests.exceptions.RequestException.

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

Что делать, если вы поймаете исключение, действительно зависит от дизайна вашей программы script/. Допустимо ли выходить? Можете ли вы продолжить и попробовать еще раз? Если ошибка катастрофична, и вы не можете продолжить, тогда да, вызов sys.exit() в порядке.

Вы можете либо поймать исключение базового класса, которое будет обрабатывать все случаи:

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e:  # This is the correct syntax
    print e
    sys.exit(1)

Или вы можете поймать их отдельно и сделать разные вещи.

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
    # Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
    # Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
    # catastrophic error. bail.
    print e
    sys.exit(1)

Как Christian указал:

Если вы хотите, чтобы ошибки HTTP (например, 401 Unauthorized) вызывали исключения, вы можете вызвать Response.raise_for_status. Это повысит значение HTTPError, если ответ был ошибкой http.

Пример:

try:
    r = requests.get('http://www.google.com/nothere')
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    print err
    sys.exit(1)

Будет напечатан:

404 Client Error: Not Found for url: http://www.google.com/nothere

Ответ 2

Еще одно предложение должно быть явным. Кажется, лучше всего перейти от конкретного к общему списку ошибок, чтобы получить желаемую ошибку, которая будет обнаружена, поэтому конкретные не будут маскироваться общим.

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

против

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

Ответ 3

Объект исключения также содержит исходный ответ 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)