Requests: معالجة الأخطاء السيئة في الطلبات في Python 3 [أثناء معالجة الاستثناء أعلاه ، حدث استثناء آخر]

تم إنشاؤها على ١٦ ديسمبر ٢٠١٩  ·  3تعليقات  ·  مصدر: psf/requests

مكتبة الطلب مع 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:: فشل في إنشاء اتصال جديد: [Errno -2] الاسم أو الخدمة غير معروفين

أثناء معالجة الاستثناء أعلاه ، حدث استثناء آخر:

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 (': فشل في إنشاء اتصال جديد: [Errno -2] الاسم أو الخدمة غير معروفين '،))

أثناء معالجة الاستثناء أعلاه ، حدث استثناء آخر:

Traceback (آخر مكالمة أخيرة):
ملف ""، السطر 1 ، في
ملف "/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 (': فشل في إنشاء اتصال جديد: [Errno -2] الاسم أو الخدمة غير معروفين '،))

"

خطوات التكاثر

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 ،
نظام التشغيل ، وج).

التعليق الأكثر فائدة

لقد عثرت للتو على نفس المشكلة ، فهل هناك طريقة مع هذا الحل للمتابعة بعد الخطأ؟
يجب ألا يتم إنهاء برنامجي بعد الاستثناء المُثار ولكني لم أجد أي طريقة للقيام بذلك.

ال 3 كومينتر

واجهت هذه المشكلة أيضًا ، لكنني وجدت حلًا لإخراج أجمل. لاحظ "من لا شيء" في البرنامج النصي هنا:

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/

لقد عثرت للتو على نفس المشكلة ، فهل هناك طريقة مع هذا الحل للمتابعة بعد الخطأ؟
يجب ألا يتم إنهاء برنامجي بعد الاستثناء المُثار ولكني لم أجد أي طريقة للقيام بذلك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات