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.
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'))
`
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:
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('
Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:
Traceback (letzter Anruf zuletzt):
Datei "
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('
`
import requests
$ 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.).
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.
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.