مكتبة الطلب مع Python3 تعالج الاستثناءات بطريقة سيئة للغاية. في python2 ، يعمل هذا بشكل جيد. حاولت طلب GitHub باستخدام requests.get('https://api.github.com')
باستخدام كل من مكتبة الطلبات المثبتة من قبل python2 ومكتبة الطلبات المثبتة على python3. تعمل بشكل مختلف عندما يتم تقديم الطلبات أثناء تعطل الشبكة. (يتم التعامل مع أي استثناء بشكل مختلف). حاول تثبيت الطلبات في كل من python2 و python3 ويمكنك إعادة إنشاء المشكلة عن طريق إزالة اتصال الإنترنت عند تقديم الطلبات. الكود الذي استخدمته
import requests
requests.get('https://api.github.com')
لقد قمت بتثبيت requests==2.5.3
في نظامي وحاولت ترقية الإصدار إلى requests==2.22.0
ولكن لا تزال المشكلة قائمة.
في python2 ، يعطي استثناءً أوضح مثل ما يلي
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 (آخر مكالمة أخيرة):
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connection.py" ، السطر 157 ، في _new_conn
(self._dns_host، self.port)، self.timeout، ** extra_kw
ملف "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py" ، السطر 61 ، في create_connection
للحصول على الدقة في socket.getaddrinfo (مضيف ، منفذ ، عائلة ، مقبس. SOCK_STREAM):
ملف "/usr/lib/python3.6/socket.py" ، السطر 745 ، في getaddrinfo
للدقائق في _socket.getaddrinfo (مضيف ، منفذ ، عائلة ، نوع ، بروتو ، أعلام):
socket.gaierror: [Errno -2] الاسم أو الخدمة غير معروفين
أثناء معالجة الاستثناء أعلاه ، حدث استثناء آخر:
Traceback (آخر مكالمة أخيرة):
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py" ، السطر 672 ، في urlopen
مقسم = مقطوع ،
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py" ، السطر 376 ، في _make_request
self._validate_conn (كون)
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py" ، السطر 994 ، في _validate_conn
conn.connect ()
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connection.py" ، السطر 334 ، في الاتصال
conn = self._new_conn ()
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connection.py" ، السطر 169 ، في _new_conn
self ، "فشل إنشاء اتصال جديد:٪ s"٪ e
urllib3.exceptions.NewConnectionError:
أثناء معالجة الاستثناء أعلاه ، حدث استثناء آخر:
Traceback (آخر مكالمة أخيرة):
ملف "/usr/local/lib/python3.6/site-packages/requests/adapters.py" ، السطر 449 ، في الإرسال
المهلة = المهلة
ملف "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py" ، السطر 720 ، في urlopen
الطريقة ، url ، الخطأ = e ، _pool = self ، _stacktrace = sys.exc_info () [2]
ملف "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py" ، السطر 436 ، في زيادة
رفع MaxRetryError (_pool أو url أو خطأ أو ResponseError (سبب))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool (host = 'api.github.com' ، المنفذ = 443): تم تجاوز الحد الأقصى لإعادة المحاولات بعنوان url: / (سببها NewConnectionError ('
أثناء معالجة الاستثناء أعلاه ، حدث استثناء آخر:
Traceback (آخر مكالمة أخيرة):
ملف "
ملف "/usr/local/lib/python3.6/site-packages/requests/api.py" ، السطر 75 ، في get
طلب الإرجاع ('get'، url، params = params، * kwargs)ملف "/usr/local/lib/python3.6/site-packages/requests/api.py" ، السطر 60 ، في الطلبإرجاع session.request (طريقة = طريقة ، url = url ، * kwargs)
ملف "/usr/local/lib/python3.6/site-packages/requests/sessions.py" ، السطر 533 ، في الطلب
Resp = self.send (الإعدادية ، * send_kwargs)ملف "/usr/local/lib/python3.6/site-packages/requests/sessions.py" ، السطر 646 ، في الإرسالr = adaptor.send (request، * kwargs)
ملف "/usr/local/lib/python3.6/site-packages/requests/adapters.py" ، السطر 516 ، في الإرسال
رفع خطأ الاتصال (البريد ، الطلب = الطلب)
Orders.exceptions.ConnectionError: HTTPSConnectionPool (host = 'api.github.com' ، المنفذ = 443): تم تجاوز الحد الأقصى لإعادة المحاولات بعنوان url: / (سببها 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
هذا الأمر متاح فقط للطلبات v2.16.4 والإصدارات الأحدث. غير ذلك،
يرجى تقديم بعض المعلومات الأساسية حول نظامك (إصدار Python ،
نظام التشغيل ، وج).
واجهت هذه المشكلة أيضًا ، لكنني وجدت حلًا لإخراج أجمل. لاحظ "من لا شيء" في البرنامج النصي هنا:
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
إذا قمت بتشغيل البرنامج النصي أعلاه ، فسيكون الإخراج أكثر نظافة:
$ 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/
يمكنك فقط عمل from None
في Python3 ، وأعتقد أنه يأتي من PEP: https://www.python.org/dev/peps/pep-0409/
واجهت هذه المشكلة أيضًا ، لكنني وجدت حلًا لإخراج أجمل. لاحظ "من لا شيء" في البرنامج النصي هنا:
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
إذا قمت بتشغيل البرنامج النصي أعلاه ، فسيكون الإخراج أكثر نظافة:
$ 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/
يمكنك فقط عمل
from None
في Python3 ، وأعتقد أنه يأتي من PEP: https://www.python.org/dev/peps/pep-0409/
لقد عثرت للتو على نفس المشكلة ، فهل هناك طريقة مع هذا الحل للمتابعة بعد الخطأ؟
يجب ألا يتم إنهاء برنامجي بعد الاستثناء المُثار ولكني لم أجد أي طريقة للقيام بذلك.
التعليق الأكثر فائدة
لقد عثرت للتو على نفس المشكلة ، فهل هناك طريقة مع هذا الحل للمتابعة بعد الخطأ؟
يجب ألا يتم إنهاء برنامجي بعد الاستثناء المُثار ولكني لم أجد أي طريقة للقيام بذلك.