2011-08-11 16 views
17
the urllib2 documentation के अनुसार

,क्यों पायथन के urllib2.urlopen() सफल स्थिति कोड के लिए बढ़ा है एक HTTPError?

क्योंकि डिफ़ॉल्ट हैंडलर 100-299 रेंज में रीडायरेक्ट (300 रेंज में कोड), और कोड संभाल सफलता से संकेत मिलता है, तो आप आमतौर पर केवल 400-599 रेंज में त्रुटि कोड देखेंगे ।

और फिर भी निम्न कोड

request = urllib2.Request(url, data, headers) 
response = urllib2.urlopen(request) 

को जन्म देती है एक HTTPError कोड 201 के साथ (बनाया):

ERROR 2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created 

तो क्यों urllib2 इस सफल अनुरोध पर HTTPErrors फेंक रहा है?

यह एक दर्द का बहुत अधिक नहीं है; मैं आसानी से करने के लिए कोड का विस्तार कर सकते हैं:

try: 
    request = urllib2.Request(url, data, headers) 
    response = urllib2.urlopen(request) 
except HTTPError, e: 
    if e.code == 201: 
     # success! :) 
    else: 
     # fail! :(
else: 
    # when will this happen...? 

लेकिन इस अभिप्रेत व्यवहार की तरह प्रतीत नहीं होता है, प्रलेखन और तथ्य यह है कि मैं इस अजीब व्यवहार के बारे में इसी तरह के सवाल नहीं मिल रहा है पर आधारित है।

इसके अलावा, else ब्लॉक क्या उम्मीद की जानी चाहिए? यदि सफल स्थिति कोड सभी को HTTPError s के रूप में समझा जाता है, तो urllib2.urlopen() कब होता है तो सभी urllib2 दस्तावेज़ों की तरह सामान्य फ़ाइल-जैसी प्रतिक्रिया वस्तु वापस लौटाती है?

+0

यह 201-299 के बीच प्रतिक्रिया-कोड को देखने के लिए वास्तव में असामान्य है यहाँ एक मैं पहले इस्तेमाल किया गया है। आश्चर्य नहीं है urllib2 उन्हें पूरी तरह से संभालना नहीं है। – Leopd

+1

क्या मुझे कुछ याद आ रहा है? 201 मेरे लिए ठीक काम करता है ... – Santa

+0

@ सांता, शायद आप एक गैर मानक हैंडलर का उपयोग कर रहे हैं, डीसीआरओस्टा के जवाब के अनुसार? – rubergly

उत्तर

3

वास्तविक पुस्तकालय प्रलेखन का उल्लेख के रूप में:

200 के लिए त्रुटि कोड, प्रतिक्रिया ऑब्जेक्ट तुरंत दिया जाता है।

गैर 200 त्रुटि कोड के लिए, यह बस, protocol_error_code हैंडलर विधियों के लिए पर काम गुजरता OpenerDirector.error के माध्यम से()। अगर कोई अन्य हैंडलर त्रुटि संभालती आखिरकार, urllib2.HTTPDefaultErrorHandler एक HTTPError बढ़ा देंगे।

http://docs.python.org/library/urllib2.html#httperrorprocessor-objects

16

आप urllib2 के साथ प्रयोग के रूप में HTTError उठाया जा रहा से विशिष्ट त्रुटि कोड को रोकने के लिए के लिए एक कस्टम Handler वर्ग लिख सकते हैं।

class BetterHTTPErrorProcessor(urllib2.BaseHandler): 
    # a substitute/supplement to urllib2.HTTPErrorProcessor 
    # that doesn't raise exceptions on status codes 201,204,206 
    def http_error_201(self, request, response, code, msg, hdrs): 
     return response 
    def http_error_204(self, request, response, code, msg, hdrs): 
     return response 
    def http_error_206(self, request, response, code, msg, hdrs): 
     return response 

तो फिर तुम यह उपयोग कर सकते हैं:

opener = urllib2.build_opener(self.BetterHTTPErrorProcessor) 
urllib2.install_opener(opener) 

req = urllib2.Request(url, data, headers) 
urllib2.urlopen(req) 
+0

आप वास्तव में इन मामलों में प्रतिक्रिया कोड कैसे देखते हैं? –

संबंधित मुद्दे