Правильный способ попробовать/за исключением использования запросов на языке Python модуль?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
это правильно? Есть ли лучший способ структурировать это? Это прикрытие?
2 ответов:
посмотрите на запросы исключение docs. Короче говоря:
в случае сетевой проблемы (например, сбой DNS, отказ в подключении и т. д.) запросы будут вызывать
ConnectionErrorисключения.в случае редкого недопустимого HTTP-ответа запросы вызовут
HTTPErrorисключения.если время ожидания запроса истекло, a
Timeoutисключение.если запрос превышает заданное количество максимальных перенаправлений, a
TooManyRedirectsисключение.все исключения, которые запросы явно вызывает наследовать от
requests.exceptions.RequestException.чтобы ответить на ваш вопрос, что вы шоу не покрыть все ваши базы. Вы будете ловить только ошибки, связанные с подключением, а не те, которые тайм-аут.
что делать, когда вы ловите исключение, действительно к дизайну вашего скрипта / программы. Допустимо ли выйти из игры? Можете ли вы пойти и попробовать еще раз? Если ошибка катастрофическая и вы не можете продолжать, то да, вызов
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)
как христианин отметил:
если вы хотите http ошибки (например, 401 несанкционированный) чтобы вызвать исключения, вы можете вызвать
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
одно дополнительное предложение, чтобы быть явными. Кажется, лучше всего перейти от конкретного к общему вниз по стеку ошибок, чтобы получить желаемую ошибку, которая будет поймана, поэтому конкретные из них не маскируются общим.
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/blahblahvs
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
Comments