2012-08-13 18 views
6

यह वेब खनन स्क्रिप्ट का एक टुकड़ा है।हैंडलिंग इनकंपलेट रीड, URLError

def printer(q,missing): 
    while 1: 
     tmpurl=q.get() 
     try: 
      image=urllib2.urlopen(tmpurl).read() 
     except httplib.HTTPException: 
      missing.put(tmpurl) 
      continue 
     wf=open(tmpurl[-35:]+".jpg","wb") 
     wf.write(image) 
     wf.close() 

q एक Queue() Urls से बना है और `लापता त्रुटि को ऊपर उठाने-यूआरएल

यह 10 धागे से समानांतर में चलाता है इकट्ठा करने के लिए एक खाली कतार है।

और जब भी मैं इसे चलाता हूं, मुझे यह मिला।

File "C:\Python27\lib\socket.py", line 351, in read 
    data = self._sock.recv(rbufsize) 
    File "C:\Python27\lib\httplib.py", line 541, in read 
    return self._read_chunked(amt) 
    File "C:\Python27\lib\httplib.py", line 592, in _read_chunked 
    value.append(self._safe_read(amt)) 
    File "C:\Python27\lib\httplib.py", line 649, in _safe_read 
    raise IncompleteRead(''.join(s), amt) 
IncompleteRead: IncompleteRead(5274 bytes read, 2918 more expected) 

लेकिन मैं except का उपयोग करते हैं ... मैं

httplib.IncompleteRead 
urllib2.URLError 

भी तरह कुछ और करने की कोशिश की,

image=urllib2.urlopen(tmpurl,timeout=999999).read() 

लेकिन इस में से कोई भी काम कर रहा है ..

मैं IncompleteRead और URLError कैसे पकड़ सकता हूं ?

+0

देर से बिट, लेकिन पहले Google पर मारा। Sooo, http://stackoverflow.com/a/14206036/1444854 आपकी समस्याओं का समाधान करना चाहिए। वैसे, आम तौर पर यदि आप कई अपवादों को पकड़ना चाहते हैं, तो उन्हें एक टुपल में रखें: सिवाय इसके कि (httplib.IncompleteRead, urllib2.URLError) –

उत्तर

0

मुझे लगता है कि इस प्रश्न का सही उत्तर उस पर निर्भर करता है जिसे आप "त्रुटि उठाने वाले यूआरएल" पर विचार करते हैं। पकड़ने कई अपवाद

की

तरीके आप किसी भी यूआरएल जो एक अपवाद तो आप क्या कर सकते हैं missing कतार में जोड़ा जाना चाहिए उठाती लगता है:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except (httplib.HTTPException, httplib.IncompleteRead, urllib2.URLError): 
    missing.put(tmpurl) 
    continue 

यह उन तीन अपवादों में से किसी भी पकड़ने और होगा उस यूआरएल को missing कतार में जोड़ें। अधिक बस तुम कर सकते हो:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except: 
    missing.put(tmpurl) 
    continue 

किसी भी अपवाद को पकड़ने के लिए, लेकिन यह pythonic नहीं माना जाता है और अपने कोड में अन्य संभावित त्रुटियों को छिपाने सकता है।

द्वारा "त्रुटि जुटाने यूआरएल" आप किसी भी URL के एक httplib.HTTPException त्रुटि को जन्म देती है मतलब लेकिन आप अभी भी प्रसंस्करण रखने के लिए चाहते हैं, तो अगर अन्य त्रुटियों तो प्राप्त कर रहे हैं आप कर सकते हैं:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except httplib.HTTPException: 
    missing.put(tmpurl) 
    continue 
except (httplib.IncompleteRead, urllib2.URLError): 
    continue 

हो जाएगा ताकि missing कतार में केवल यूआरएल जोड़ें यदि यह httplib.HTTPException उठाता है लेकिन अन्यथा httplib.IncompleteRead और urllib.URLError पकड़ लेगा और आपकी स्क्रिप्ट को क्रैश होने से रोक देगा।

एक कतार

एक अलग रूप में के रूप में अधिक पुनरावृत्ति, while 1 छोरों हमेशा मुझसे विषय में एक सा है। आप निम्न पद्धति का उपयोग कर कतार सामग्री के माध्यम से लूप में सक्षम होना चाहिए, हालांकि आप इसे अपने तरीके से कर रही जारी रखने के लिए स्वतंत्र हैं:

for tmpurl in iter(q, "STOP"): 
    # rest of your code goes here 
    pass 

सुरक्षित रूप से अलग फ़ाइलों

एक और के रूप में काम करने के साथ, जब तक यह बिल्कुल जरूरी है अन्यथा करने के लिए, फ़ाइलों को खोलने और संशोधित करने के लिए आपको context managers का उपयोग करना चाहिए।तो अपने तीन फ़ाइल आपरेशन लाइनों बन जाएगा:

with open(tmpurl[-35:]+".jpg","wb") as wf: 
    wf.write() 

संदर्भ प्रबंधक फ़ाइल को बंद करने का ख्याल रखता है, और एक अपवाद तब होता है, भले ही फ़ाइल के लिए लिख ऐसा ही करेगा।