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

Ist das richtig? Gibt es einen besseren Weg, dies zu strukturieren? Wird dies alle meine Basen abdecken?

572
John Smith 12 Mai 2013 im 23:44

3 Antworten

Beste Antwort

Schauen Sie sich die Ausnahmedokumente an. Zusamenfassend:

Bei einem Netzwerkproblem (z. B. DNS-Fehler, verweigerte Verbindung usw.) lösen Anfragen eine ConnectionError Ausnahme aus.

Im Falle der seltenen ungültigen HTTP-Antwort lösen Anfragen eine HTTPError Ausnahme aus.

Wenn eine Anforderung abgelaufen ist, wird eine Timeout Ausnahme ausgelöst.

Wenn eine Anforderung die konfigurierte Anzahl maximaler Umleitungen überschreitet, wird eine TooManyRedirects Ausnahme ausgelöst.

Alle Ausnahmen, die Requests explizit auslösen, erben von requests.exceptions.RequestException .

Um Ihre Frage zu beantworten, deckt das, was Sie zeigen, nicht alle Ihre Basen ab. Sie werden nur verbindungsbezogene Fehler abfangen, keine, bei denen eine Zeitüberschreitung auftritt.

Was zu tun ist, wenn Sie die Ausnahme abfangen, hängt wirklich vom Design Ihres Skripts / Programms ab. Ist es akzeptabel zu beenden? Können Sie es erneut versuchen? Wenn der Fehler katastrophal ist und Sie nicht weitermachen können, ist ein Aufruf von sys.exit() angebracht.

Sie können entweder die Basisklassenausnahme abfangen, die alle Fälle behandelt:

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

Oder Sie können sie separat fangen und verschiedene Dinge tun.

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)

Wie Christian betonte:

Wenn Sie möchten, dass http-Fehler (z. B. 401 Unauthorized) Ausnahmen auslösen, können Sie aufrufen. > Response.raise_for_status. Dies löst ein HTTPError aus, wenn die Antwort ein http-Fehler war.

Ein Beispiel:

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

Wird drucken:

404 Client Error: Not Found for url: http://www.google.com/nothere
716
Ocaso Protal 30 Jän. 2020 im 11:19

Das Ausnahmeobjekt enthält auch die ursprüngliche Antwort e.response, die hilfreich sein kann, wenn der Fehlerkörper als Antwort vom Server angezeigt werden muss. Beispielsweise:

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)
4
tsh 24 Sept. 2019 im 17:19

Ein zusätzlicher Vorschlag, um explizit zu sein. Es scheint am besten, von spezifisch zu allgemein zu wechseln, um den gewünschten Fehler abzufangen, damit die spezifischen Fehler nicht durch den allgemeinen Fehler maskiert werden.

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
73
Sam 30 Dez. 2017 im 02:32