कोशिश करने का सही तरीका / पायथन अनुरोध मॉड्यूल का उपयोग करने के अलावा?


418
try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print e #should I also sys.exit(1) after this?

क्या ये सही है? क्या इसकी संरचना करने का एक बेहतर तरीका है? क्या यह मेरे सभी ठिकानों को कवर करेगा?


जवाबों:


794

अनुरोध अपवाद डॉक्स पर एक नज़र डालें । संक्षेप में:

नेटवर्क समस्या (जैसे 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_statusHTTPErrorयदि कोई प्रतिक्रिया 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

11
अनुरोध लाइब्रेरी की बारीकियों से निपटने के लिए बहुत अच्छा जवाब, और सामान्य अपवाद-पकड़ने वाला भी।
ब्रायन पीटरसन

10
ध्यान दें कि अंडरलेइंग urllib3 लाइब्रेरी में एक बग के कारण, socket.timeoutयदि आपको टाइमआउट का उपयोग कर रहे हैं, तो आपको अपवादों को भी पकड़ना होगा : github.com/kennethreitz/requests/issues/1236
jb।

15
भविष्य के टिप्पणी पाठक: यह अनुरोध 2.9 में तय किया गया था (जो urllib3 1.13 को बंडल करता है)
RazerM

14
यदि आप अपवादों को बढ़ाने के लिए http त्रुटियों (जैसे 401 अनधिकृत) चाहते हैं, तो आप Response.raise_for_status कह सकते हैं । यदि प्रतिक्रिया HTTP त्रुटि थी, तो HTTPError बढ़ाएगा।
क्रिश्चियन लॉन्ग

5
अनुरोध वेबसाइट पर अपवाद सूची पूरी नहीं है। आप पूरी सूची यहां पढ़ सकते हैं ।
एपोक

87

स्पष्ट होने के लिए एक अतिरिक्त सुझाव। वांछित त्रुटि को पकड़ने के लिए त्रुटियों के ढेर के नीचे विशिष्ट से सामान्य तक जाना सबसे अच्छा लगता है, इसलिए विशिष्ट लोगों को सामान्य से मुखौटा नहीं मिलता है।

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

क्या यह पोस्ट के लिए भी सिंटैक्स है?
स्किपिओअफ्रीकनस

@ScipioAfricanus हाँ।
andrea

10

अपवाद ऑब्जेक्ट में मूल प्रतिक्रिया भी होती है 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.