Requests: Schlechte Fehlerbehandlung in Anfragen in Python 3 [Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten]

Erstellt am 16. Dez. 2019  ·  3Kommentare  ·  Quelle: psf/requests

Request-Bibliothek mit Python3 behandelt Ausnahmen ziemlich schlecht. In Python2 funktioniert das einwandfrei. Ich habe versucht, GitHub mit requests.get('https://api.github.com') anzufordern, indem ich sowohl die Bibliothek für installierte Python2-Anfragen als auch die Bibliothek für installierte Python3-Anfragen verwendet habe. Sie verhalten sich unterschiedlich, wenn die Anforderungen während eines Netzwerkausfalls gestellt werden. (Jede Ausnahme wird anders behandelt). Versuchen Sie, Anfragen sowohl in Python2 als auch in Python3 zu installieren, und Sie können das Problem wiederherstellen, indem Sie die Internetverbindung entfernen, wenn Sie die Anfragen stellen. Code, den ich verwendet habe
import requests
requests.get('https://api.github.com')

Ich habe requests==2.5.3 in meinem System installiert und habe versucht, die Version auf requests==2.22.0 aktualisieren, aber das Problem besteht weiterhin.

erwartetes Ergebnis

In Python2 gibt es eine saubere Ausnahme wie die folgende
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 65, in get return request('get', url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 49, in request response = session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 461, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 573, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 415, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', gaierror(-2, 'Name or service not known'))

Tatsächliche Ergebnis

`
Traceback (letzter Anruf zuletzt):
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", Zeile 157, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
Datei "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", Zeile 61, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
Datei "/usr/lib/python3.6/socket.py", Zeile 745, in getaddrinfo
für res in _socket.getaddrinfo (Host, Port, Familie, Typ, Proto, Flags):
socket.gaierror: [Errno -2] Name oder Dienst nicht bekannt

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", Zeile 672, in urlopen
stückig = stückig,
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", Zeile 376, in _make_request
self._validate_conn(conn)
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", Zeile 994, in _validate_conn
conn.connect()
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", Zeile 334, in connect
conn = self._new_conn()
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", Zeile 169, in _new_conn
self, "Neue Verbindung konnte nicht aufgebaut werden: %s" % e
urllib3.Exceptions.NewConnectionError:: Neue Verbindung konnte nicht aufgebaut werden: [Errno -2] Name oder Dienst nicht bekannt

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/usr/local/lib/python3.6/site-packages/requests/adapters.py", Zeile 449, in send
Zeitüberschreitung = Zeitüberschreitung
Datei "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", Zeile 720, in urlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
Datei "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", Zeile 436, inkrementell
raise MaxRetryError(_pool, url, error oder ResponseError(cause))
urllib3.Exceptions.MaxRetryError: HTTPSConnectionPool(host='api.github.com', port=443): Max. Wiederholungen überschritten mit URL: / (Caused by NewConnectionError(': Fehler beim Aufbau einer neuen Verbindung: [Errno -2] Name oder Dienst nicht bekannt',))

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "", Zeile 1, in
Datei "/usr/local/lib/python3.6/site-packages/requests/api.py", Zeile 75, in get
Rückgabeanforderung('get', url, params=params, *kwargs)Datei "/usr/local/lib/python3.6/site-packages/requests/api.py", Zeile 60, in Anfragereturn session.request(method=method, url=url, * kwargs)
Datei "/usr/local/lib/python3.6/site-packages/requests/sessions.py", Zeile 533, in request
resp = self.send(prep, *send_kwargs)Datei "/usr/local/lib/python3.6/site-packages/requests/sessions.py", Zeile 646, in sendr = adapter.send (Anfrage, * Kwargs)
Datei "/usr/local/lib/python3.6/site-packages/requests/adapters.py", Zeile 516, in send
ConnectionError(e, request=request) erhöhen
Requests.Exceptions.ConnectionError: HTTPSConnectionPool(host='api.github.com', port=443): Max. Wiederholungen überschritten mit URL: / (Caused by NewConnectionError(': Fehler beim Aufbau einer neuen Verbindung: [Errno -2] Name oder Dienst nicht bekannt',))

`

Reproduktionsschritte

import requests

System Information

$ python -m requests.help
Python 2.7.15+ (Python2 version)
requests==2.5.3 (Requests version in python2)
=============================
Python 3.6.9 (Python3 version)
requests==2.5.3(Requests version in python3)
=============================
OS: Ubuntu 18.04.3 LTS

Dieser Befehl ist nur in Requests v2.16.4 und höher verfügbar. Ansonsten,
Bitte geben Sie einige grundlegende Informationen zu Ihrem System an (Python-Version,
Betriebssystem usw.).

Hilfreichster Kommentar

Ich bin gerade über das gleiche Problem gestolpert, gibt es eine Möglichkeit mit dieser Problemumgehung, nach dem Fehler fortzufahren?
Mein Programm sollte nach der ausgelösten Ausnahme nicht beendet werden, aber ich habe keine Möglichkeit dazu gefunden.

Alle 3 Kommentare

Ich bin auch auf dieses Problem gestoßen, aber ich habe eine Problemumgehung für eine schönere Ausgabe gefunden. Beachten Sie das "from None" im Skript hier:

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

Wenn Sie das obige Skript ausführen, ist die Ausgabe viel sauberer:

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Sie können from None in Python3 ausführen, und ich denke, es kommt von diesem PEP: https://www.python.org/dev/peps/pep-0409/

Ich bin auch auf dieses Problem gestoßen, aber ich habe eine Problemumgehung für eine schönere Ausgabe gefunden. Beachten Sie das "from None" im Skript hier:

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

Wenn Sie das obige Skript ausführen, ist die Ausgabe viel sauberer:

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Sie können from None in Python3 ausführen, und ich denke, es kommt von diesem PEP: https://www.python.org/dev/peps/pep-0409/

Ich bin gerade über das gleiche Problem gestolpert, gibt es eine Möglichkeit mit dieser Problemumgehung, nach dem Fehler fortzufahren?
Mein Programm sollte nach der ausgelösten Ausnahme nicht beendet werden, aber ich habe keine Möglichkeit dazu gefunden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen