try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
क्या ये सही है? क्या इसकी संरचना करने का एक बेहतर तरीका है? क्या यह मेरे सभी ठिकानों को कवर करेगा?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
क्या ये सही है? क्या इसकी संरचना करने का एक बेहतर तरीका है? क्या यह मेरे सभी ठिकानों को कवर करेगा?
जवाबों:
अनुरोध अपवाद डॉक्स पर एक नज़र डालें । संक्षेप में:
नेटवर्क समस्या (जैसे DNS विफलता, इनकार कनेक्शन, आदि) की स्थिति में, अनुरोध एक उठाएंगे
ConnectionError
अपवाद ।दुर्लभ अमान्य HTTP प्रतिक्रिया की स्थिति में, अनुरोध एक
HTTPError
अपवाद को बढ़ाएगा ।यदि कोई अनुरोध बाहर निकलता है, तो एक
Timeout
अपवाद उठाया जाता है।यदि अनुरोध अधिकतम पुनर्निर्देशन की कॉन्फ़िगर संख्या से अधिक है, तो एक
TooManyRedirects
अपवाद उठाया जाता है।सभी अपवाद जो अनुरोध स्पष्ट रूप से विरासत से उठाते हैं
requests.exceptions.RequestException
।
आपके प्रश्न का उत्तर देने के लिए, आप जो दिखाते हैं वह आपके सभी आधारों को कवर नहीं करेगा । आप केवल कनेक्शन-संबंधित त्रुटियों को पकड़ेंगे, न कि उस समय के बाहर।
जब आप अपवाद को पकड़ते हैं तो क्या करना है यह वास्तव में आपकी स्क्रिप्ट / कार्यक्रम के डिजाइन तक है। क्या यह बाहर निकलने के लिए स्वीकार्य है? क्या आप आगे बढ़ सकते हैं और फिर से कोशिश कर सकते हैं? यदि त्रुटि भयावह है और आप आगे नहीं बढ़ सकते हैं, तो हाँ, आप SystemExit (त्रुटि दोनों को प्रिंट करने और कॉल करने का एक अच्छा तरीका) बढ़ाकर अपने कार्यक्रम को रद्द कर सकते हैंsys.exit
।
आप या तो बेस-क्लास अपवाद को पकड़ सकते हैं, जो सभी मामलों को संभालेंगे:
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
raise SystemExit(e)
या आप उन्हें अलग-अलग पकड़ सकते हैं और अलग-अलग चीजें कर सकते हैं।
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
# Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
# Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
# catastrophic error. bail.
raise SystemExit(e)
जैसा कि ईसाई ने बताया:
यदि आप अपवादों को बढ़ाने के लिए http त्रुटियों (जैसे 401 अनधिकृत) चाहते हैं, तो आप कॉल कर सकते हैं
Response.raise_for_status
।HTTPError
यदि कोई प्रतिक्रिया http त्रुटि थी, तो यह एक वृद्धि करेगा ।
एक उदाहरण:
try:
r = requests.get('http://www.google.com/nothere')
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
प्रिंट होगा:
404 Client Error: Not Found for url: http://www.google.com/nothere
socket.timeout
यदि आपको टाइमआउट का उपयोग कर रहे हैं, तो आपको अपवादों को भी पकड़ना होगा : github.com/kennethreitz/requests/issues/1236
स्पष्ट होने के लिए एक अतिरिक्त सुझाव। वांछित त्रुटि को पकड़ने के लिए त्रुटियों के ढेर के नीचे विशिष्ट से सामान्य तक जाना सबसे अच्छा लगता है, इसलिए विशिष्ट लोगों को सामान्य से मुखौटा नहीं मिलता है।
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
Http Error: 404 Client Error: Not Found for url: http://www.google.com/blahblah
बनाम
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah
अपवाद ऑब्जेक्ट में मूल प्रतिक्रिया भी होती है e.response
, जो सर्वर से प्रतिक्रिया में त्रुटि शरीर को देखने की आवश्यकता होने पर उपयोगी हो सकती है। उदाहरण के लिए:
try:
r = requests.post('somerestapi.com/post-here', data={'birthday': '9/9/3999'})
r.raise_for_status()
except requests.exceptions.HTTPError as e:
print (e.response.text)