Requests: Penanganan kesalahan yang buruk dalam permintaan di python 3 [Selama penanganan pengecualian di atas, pengecualian lain terjadi]

Dibuat pada 16 Des 2019  ·  3Komentar  ·  Sumber: psf/requests

perpustakaan permintaan dengan Python3 menangani pengecualian dengan cara yang sangat buruk. Di python2 ini berfungsi dengan baik. Saya mencoba meminta GitHub menggunakan requests.get('https://api.github.com') menggunakan perpustakaan permintaan yang diinstal python2 dan perpustakaan permintaan yang diinstal python3. Mereka tampil berbeda ketika permintaan dibuat selama jaringan mati. (pengecualian apa pun ditangani secara berbeda). Coba instal permintaan di python2 dan python3 dan Anda dapat membuat ulang masalah dengan menghapus koneksi internet saat membuat permintaan. Kode yang saya gunakan
import requests
requests.get('https://api.github.com')

Saya telah menginstal requests==2.5.3 di sistem saya dan saya mencoba memutakhirkan versi ke requests==2.22.0 tetapi masalah tetap ada.

Hasil yang diharapkan

Di python2 memberikan pengecualian yang lebih bersih seperti berikut ini
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'))

Hasil Sebenarnya

`
Traceback (panggilan terakhir terakhir):
File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", baris 157, di _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
File "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", baris 61, di create_connection
untuk res di socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "/usr/lib/python3.6/socket.py", baris 745, di getaddrinfo
untuk res di _socket.getaddrinfo(Host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Nama atau layanan tidak diketahui

Selama penanganan pengecualian di atas, pengecualian lain terjadi:

Traceback (panggilan terakhir terakhir):
File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", baris 672, di urlopen
terpotong = terpotong,
File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", baris 376, di _make_request
self._validate_conn(sambungan)
File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", baris 994, di _validate_conn
sambung.koneksi()
File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", baris 334, terhubung
samb = self._new_conn()
File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", baris 169, di _new_conn
self, "Gagal membuat sambungan baru: %s" % e
urllib3.exceptions.NewConnectionError:: Gagal membuat koneksi baru: [Errno -2] Nama atau layanan tidak diketahui

Selama penanganan pengecualian di atas, pengecualian lain terjadi:

Traceback (panggilan terakhir terakhir):
File "/usr/local/lib/python3.6/site-packages/requests/adapters.py", baris 449, di kirim
batas waktu = batas waktu
File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", baris 720, di urlopen
metode, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", baris 436, secara bertahap
naikkan MaxRetryError(_pool, url, error atau ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.github.com', port=443): Percobaan ulang maksimum terlampaui dengan url: / (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno -2] Nama atau layanan tidak dikenal',))

Selama penanganan pengecualian di atas, pengecualian lain terjadi:

Traceback (panggilan terakhir terakhir):
berkas "", baris 1, di
File "/usr/local/lib/python3.6/site-packages/requests/api.py", baris 75, di get
kembali permintaan('dapatkan', url, params=params, *kwargs)File "/usr/local/lib/python3.6/site-packages/requests/api.py", baris 60, dalam permintaankembali session.request(metode=metode, url=url, * kwargs)
File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", baris 533, dalam permintaan
resp = self.send(persiapan, *send_kwargs)File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", baris 646, di kirimr = adapter.send(permintaan, * kwargs)
File "/usr/local/lib/python3.6/site-packages/requests/adapters.py", baris 516, di kirim
naikkan ConnectionError(e, request=request)
request.exceptions.ConnectionError: HTTPSConnectionPool(host='api.github.com', port=443): Percobaan ulang maksimum terlampaui dengan url: / (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno -2] Nama atau layanan tidak dikenal',))

`

Langkah Reproduksi

import requests

Sistem Informasi

$ 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

Perintah ini hanya tersedia di Requests v2.16.4 dan yang lebih baru. Jika tidak,
berikan beberapa informasi dasar tentang sistem Anda (versi Python,
sistem operasi, &c).

Komentar yang paling membantu

Saya baru saja menemukan masalah yang sama, apakah ada cara dengan solusi ini untuk melanjutkan setelah kesalahan?
Program saya seharusnya tidak keluar setelah pengecualian yang muncul tetapi saya tidak menemukan cara untuk melakukannya.

Semua 3 komentar

Saya juga mengalami masalah ini, tetapi saya menemukan solusi untuk hasil yang lebih cantik. Perhatikan "dari Tidak Ada" dalam skrip di sini:

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

Jika Anda menjalankan skrip di atas, hasilnya jauh lebih bersih:

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

Anda hanya dapat melakukan from None di Python3, dan saya pikir itu berasal dari PEP ini: https://www.python.org/dev/peps/pep-0409/

Saya juga mengalami masalah ini, tetapi saya menemukan solusi untuk hasil yang lebih cantik. Perhatikan "dari Tidak Ada" dalam skrip di sini:

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

Jika Anda menjalankan skrip di atas, hasilnya jauh lebih bersih:

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

Anda hanya dapat melakukan from None di Python3, dan saya pikir itu berasal dari PEP ini: https://www.python.org/dev/peps/pep-0409/

Saya baru saja menemukan masalah yang sama, apakah ada cara dengan solusi ini untuk melanjutkan setelah kesalahan?
Program saya seharusnya tidak keluar setelah pengecualian yang muncul tetapi saya tidak menemukan cara untuk melakukannya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

justlurking picture justlurking  ·  3Komentar

NoahCardoza picture NoahCardoza  ·  4Komentar

Matt3o12 picture Matt3o12  ·  3Komentar

ReimarBauer picture ReimarBauer  ·  4Komentar

cnicodeme picture cnicodeme  ·  3Komentar