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



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


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

696   2  

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/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

Comments

    Ничего не найдено.