2011-01-31 15 views
2

私は、Python/Mechanizeで書かれた大量のダウンロードアプリケーションを持っています.20,000ファイルのようなものをダウンロードしようとしています。明らかに、大きなダウロードのダウンローダーは、時々エラーECONNRESETに遭遇することがあります。今、私はeach of these individuallyを処理する方法を知っているが、それには二つの問題があります:Python/MechanizeでECONNRESETから回復する

  1. 私は本当にむしろ、try/catchブロック内のすべての単一のアウトバウンドのWeb呼び出しをラップしていないと思いますが。
  2. 私がそうしたとしても、例外がスローされたらエラーを処理する方法を知ることに問題があります。

    data = None 
    while (data == None): 
        try: 
         data = browser.response().read() 
        except IOError as e: 
         if e.args[1].args[0].errno != errno.ECONNRESET: 
          raise 
         data = None 
    

    それは

    browser.follow_link(link) 
    

    の単なるランダムなインスタンスの場合は、その後どのように私は実行します。コードはちょうど

    data = browser.response().read() 
    

    であれば、私はつまり、それに対処するために、正確に方法を知っていますECONNRESETがここに投げ込まれた場合、Mechanizeの内部状態はどうなっているのでしょうか?たとえば、コードをもう一度試す前にbrowser.back()に電話する必要がありますか?そのようなエラーから回復する適切な方法は何ですか?

編集:受け入れられた回答の解決策は確実に機能しますが、私の場合は実装するのが難しくないことが判明しました。しかし、私はまだ学問的に興味がありますが、エラーを迅速に処理できるエラー処理メカニズムがあるかどうかに関心があります。

答えて

2

おそらく、コマンドのチェーンにまで高いtry..exceptブロックを置く:エラーハンドラのためのより良い方法はありません場合

import collections 
def download_file(url): 
    # Bundle together the bunch of browser calls necessary to download one file. 
    browser.follow_link(...) 
    ... 
    response=browser.response() 
    data=response.read() 

urls=collections.deque(urls) 

while urls: 
    url=urls.popleft() 
    try: 
     download_file(url) 
    except IOError as err: 
     if err.args[1].args[0].errno != errno.ECONNRESET: 
      raise 
     else: 
      # if ECONNRESET error, add the url back to urls to try again later 
      urls.append(url) 
+0

私は「核オプション」としてこれを考えていました。ありがとう! –

+0

@Charles Pence:あなたはそれをより賢くすることができますが、それはtry ... exceptブロックを各Web呼び出しの周りに配置し、ケースごとに各エラーを処理することです。これは、プログラマだけが、任意の時点で障害が発生した場合に適切なアクションを決定することができるためです。 – unutbu

+0

実際、これは私が考えていたよりも簡単に実装できることが判明しました。みんなありがとう! –

関連する問題