try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Это верно? Есть ли лучший способ структурировать это? Покроет ли это все мои базы?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Это верно? Есть ли лучший способ структурировать это? Покроет ли это все мои базы?
Ознакомьтесь с документами об исключениях запросов. Суммируя:
В случае проблем с сетью (например, сбой DNS, отказ в соединении и т. Д.) Запросы вызовут исключение
ConnectionError
.В случае редкого недействительного ответа HTTP запросы вызывают исключение
HTTPError
.Если время ожидания запроса истекло, возникает исключение
Timeout
.Если запрос превышает настроенное максимальное количество перенаправлений, возникает исключение
TooManyRedirects
.Все исключения, которые явно вызывает Requests, наследуются от
requests.exceptions.RequestException
.
Чтобы ответить на ваш вопрос, то, что вы показываете, не охватывает все ваши базы. Вы будете обнаруживать только ошибки, связанные с подключением, а не те, которые истекли.
Что делать, когда вы перехватываете исключение, действительно зависит от дизайна вашего скрипта / программы. Приемлем ли выход? Вы можете продолжить и попробовать еще раз? Если ошибка является катастрофической и вы не можете продолжить, то да, вы можете прервать выполнение своей программы, подняв SystemExit (удобный способ вывести сообщение об ошибке и вызвать sys.exit
).
Вы можете поймать исключение базового класса, которое будет обрабатывать все случаи:
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
raise SystemExit(e)
Или вы можете поймать их по отдельности и делать разные вещи.
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.
raise SystemExit(e)
Как отметил Кристиан:
Если вы хотите, чтобы ошибки 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:
raise SystemExit(err)
Напечатаем:
404 Client Error: Not Found for url: http://www.google.com/nothere
socket.timeout
исключения, если вы используете тайм-аут: github.com/kennethreitz/requests/issues/1236
- person jb.; 21.08.2014
r.raise_for_status()
возвращает ошибку? Сообщение по умолчанию довольно пугающее, и я хотел бы дать пользователю несколько советов о том, как избежать ответов об ошибках.
- person user5359531; 27.04.2017
print
разные сообщения для каждого из них.
- person Jonathon Reinhart; 27.04.2017
urllib3
для повторной попытки по определенным кодам возврата, - это requests.exceptions.RetryError
. Чтобы выполнить повторные попытки, но избежать необходимости перехватывать сбои, см. stackoverflow.com/questions/43481165/
- person nealmcb; 17.10.2017
Еще одно уточнение. Кажется, лучше всего перейти от конкретных к общим ошибкам, чтобы получить желаемую ошибку, которую нужно отловить, чтобы конкретные ошибки не маскировались общей.
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
vs
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)