2011-01-31 3 views
2

20,000 개의 파일을 다운로드하려고하는 Python/Mechanize로 작성된 대규모 일괄 다운로드 응용 프로그램이 있습니다. 확실히 어떤 큰 다운로더라도 가끔 ECONNRESET 오류가 발생합니다. 지금, 나는 each of these individually을 처리하는 방법을 알고 있지만, 두 가지 문제가 그와 함께있다 : 난 정말이 아니라 try/catch 블록에서 모든 단일 아웃 바운드 웹 호출을 포장하지 않는 게 좋을Python/Mechanize의 ECONNRESET에서 복구

  1. .
  2. 이렇게해도 예외가 발생하면 오류를 처리하는 방법을 알고있는 데 문제가 있습니다. 코드가 그럼 그냥

    data = browser.response().read() 
    

    경우 I 즉, 그것을 처리하는 방법을 정확하게 알고

    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) 
    

    단지 임의의 인스턴스가 있다면 어떻게 할 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 블록을 배치하고 사례 별 기준으로 각 오류를 처리해야합니다. 프로그래머 만이 주어진 시점에서 실패 할 경우 적절한 조치가 무엇인지 결정할 수 있기 때문입니다. – unutbu

+0

사실, 이것은 생각했던 것보다 구현하기가 쉽다는 것을 증명했습니다. 고마워요! –