2012-08-13 27 views
6

đó là một đoạn mã kịch bản khai thác web.Xử lý Chưa hoàn tấtĐọc, 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 là một Queue() gồm url và 'mất tích là một hàng đợi rỗng để thu thập lỗi-chăn-urls

nó chạy song song 10 chủ đề.

và mỗi khi tôi chạy điều này, tôi nhận được điều này.

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) 

nhưng tôi sử dụng except ... tôi đã cố gắng cái gì khác như

httplib.IncompleteRead 
urllib2.URLError 

thậm chí,

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

nhưng không ai trong số này đang làm việc ..

làm thế nào tôi có thể bắt được IncompleteReadURLError ?

+0

Chậm, nhưng lần đầu tiên nhấn vào google. Sooo, http://stackoverflow.com/a/14206036/1444854 nên giải quyết vấn đề của bạn. Nhân tiện, nói chung nếu bạn muốn bắt nhiều ngoại lệ, hãy đặt chúng vào một bộ tuple: ngoại trừ (httplib.IncompleteRead, urllib2.URLError) –

Trả lời

0

Tôi nghĩ câu trả lời đúng cho câu hỏi này tùy thuộc vào những gì bạn xem là "URL gây lỗi".

Phương pháp đánh bắt nhiều trường hợp ngoại lệ

Nếu bạn nghĩ rằng bất kỳ URL mà đặt ra một ngoại lệ nên được bổ sung vào missing hàng đợi sau đó bạn có thể làm:

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

này sẽ bắt bất kỳ của những ba trường hợp ngoại lệ và thêm url đó vào hàng đợi missing. Đơn giản hơn bạn có thể làm:

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

Để bắt bất kỳ ngoại lệ nhưng điều này không được coi là Pythonic và có thể che giấu các lỗi khác có thể trong mã của bạn.

Nếu theo "URL lỗi nuôi" bạn có nghĩa là bất kỳ URL mà đặt ra một lỗi httplib.HTTPException nhưng bạn vẫn muốn giữ xử lý nếu các lỗi khác được tiếp nhận sau đó bạn có thể làm:

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

chí này chỉ thêm URL vào hàng đợi missing nếu nó tăng httplib.HTTPException nhưng nếu không sẽ bắt được httplib.IncompleteReadurllib.URLError và giữ tập lệnh của bạn không bị lỗi.

iterating trên một Queue

Là một sang một bên, while 1 vòng luôn luôn là một chút liên quan đến tôi. Bạn sẽ có thể lặp qua các nội dung Queue sử dụng mẫu sau, mặc dù bạn đang miễn phí để tiếp tục làm việc đó theo cách của bạn:

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

an toàn làm việc với các tập tin

Như một sang một bên, trừ khi đó là hoàn toàn cần thiết để làm khác, bạn nên sử dụng context managers để mở và sửa đổi tệp.Vì vậy, ba dòng hoạt động tập tin của bạn sẽ trở thành:

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

Trình quản lý ngữ cảnh sẽ xử lý việc đóng tệp và sẽ làm như vậy ngay cả khi ghi vào tệp.