8

これは Web マイニング スクリプトの一部です。

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()

qQueue()URL で構成され、`missing はエラー発生 URL を収集するための空のキューです

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か?

4

1 に答える 1

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

例外をキャッチますが、これは Pythonic とは見なされず、コード内の他の可能性のあるエラーを隠す可能性があります。

「エラー発生 URL」とは、エラーを発生させる URL を意味するhttplib.HTTPExceptionが、他のエラーが受信された場合でも処理を続行したい場合は、次のように実行できます。

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

missingこれは、発生した場合にのみ URL をキューに追加しますが、httplib.HTTPExceptionそれ以外の場合はキャッチhttplib.IncompleteReadurllib.URLErrorて、スクリプトがクラッシュしないようにします。

キューの反復

余談ですが、while 1ループは常に私にとって少し心配です。次のパターンを使用して Queue の内容をループできるはずですが、自分のやり方で自由に続けることができます。

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

ファイルを安全に操作する

余談ですが、絶対に別のことを行う必要がない限り、コンテキスト マネージャーを使用してファイルを開いて変更する必要があります。したがって、3 つのファイル操作行は次のようになります。

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

コンテキスト マネージャーはファイルを閉じる処理を行い、ファイルへの書き込み中に例外が発生した場合でも処理を行います。

于 2015-10-21T20:34:28.513 に答える