2012-08-13 21 views
6

これはWebマイニングスクリプトです。未処理のURLエラーの処理

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

は、URLからなるQueue()と `欠落は、10件のスレッドによって並列に実行エラー調達-のURL

を収集する空のキューです。

と私はこれを実行するたびに、私はこれを持っています。

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を使用するのです... 私は

..

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

が、これのどれもが作業していない、でも

httplib.IncompleteRead 
urllib2.URLError 

のような何か他のものを試してみましたIncompleteReadURLErrorをキャッチするには?

+0

ビットが遅くなりますが、最初はGoogleでヒットしました。 Sooo、http://stackoverflow.com/a/14206036/1444854はあなたの問題を解決するはずです。ところで、一般に、複数の例外をキャッチしたい場合は、それらをタプルに入れます:except(httplib.IncompleteRead、urllib2.URLError) –

答えて

0

この質問に対する正解は、「エラーが発生したURL」とみなされます。複数の例外に

を引くの

方法あなたは例外を発生させる任意のURLがmissingキューに追加されるべきだと思うなら、あなたが行うことができます:

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

これは、これらの3つの例外のいずれかをキャッチし、そのURLをmissingキューに追加します。

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

どんなの例外をキャッチするが、これはPython的とはみなされませんし、あなたのコード内の他の可能性のあるエラーを隠すことができます:もっと簡単にあなたが行うことができます。

「エラー調達URL」によって、あなたはhttplib.HTTPExceptionエラーを発生させる任意のURLを意味していますが、まだ処理を維持したい場合は、他のエラーは、受信している場合は行うことができます。

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

この意志をhttplib.HTTPExceptionが発生した場合は、missingキューにURLを追加するだけですが、それ以外の場合は​​とurllib.URLErrorをキャッチし、スクリプトがクラッシュすることはありません。キュー

オーバー

反復処理はさておき、while 1ループは常に私に関わるビットであるため。あなたはそれをあなたの方法をやって続けるのは自由ですが、以下のパターンを使用して、キューの内容をループことができるようになります。それは絶対に必要でない限り

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

は安全、脇別としてファイル

での作業しますそうでない場合は、context managersを使用してファイルを開いて変更する必要があります。だから、あなたの3ファイル操作ラインはなる:

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

コンテキストマネージャは、ファイルを閉じるの世話をし、ファイルへの書き込み中に例外が発生した場合でもそうでしょう。

関連する問題