2015-09-02 3 views
3

Я создаю скрипт Python, который просматривает мою базу данных для всех URL-адресов, а затем следует URL-адресам, чтобы найти неработающие ссылки. Этот сценарий требует использования обработки исключений для входа, когда он сталкивается с ошибкой открытия ссылки, однако он начал встречая ошибку, что я был совершенно не в состоянии написать, кроме заявления на:Catching ConnectionResetError с Python

Traceback (most recent call last): 
    File "exceptionerror.py", line 97, in <module> 
    raw_response = response.read().decode('utf8', errors='ignore') 
    File "/usr/lib/python3.4/http/client.py", line 512, in read 
    s = self._safe_read(self.length) 
    File "/usr/lib/python3.4/http/client.py", line 662, in _safe_read 
    chunk = self.fp.read(min(amt, MAXAMOUNT)) 
    File "/usr/lib/python3.4/socket.py", line 371, in readinto 
    return self._sock.recv_into(b) 
ConnectionResetError: [Errno 104] Connection reset by peer 

Я попытался следующее :

except SocketError as inst: 
    brokenlinksflag = 1 
    brokenlinks = articlelinks[j] + ' ' + sys.exc_info()[0] + ', ' + brokenlinks 
    continue 

И:

except ConnectionResetError as inst: 
    brokenlinksflag = 1 
    brokenlinks = articlelinks[j] + ' ' + sys.exc_info()[0] + ', ' + brokenlinks 
    continue 

И даже полное общее исключение, чтобы попытаться поймать все ошибки просто так не убивает весь сценарий:

except: 
    print("This link was not caught by defined exceptions: " + articlelinks[j]) 
    continue 

У меня полная потеря за то, как мой скрипт поймал эту ошибку, чтобы она могла продолжать проверять неработающие ссылки, а не жесткие сбои. Это прерывисто, поэтому я не верю, что ссылка сломана, и я чувствую, что, хотя я идентифицировал URL-адрес, просто поймал его и пропустил его, прежде чем рука обманывает, так как моя цель - правильно обрабатывать исключения. Может ли кто-нибудь посоветовать мне, как справиться с этим исключением?

Для справки, вот мой полный цикл:

for j in range(0, len(articlelinks)): 
    try: 
     req=urllib.request.Request(articlelinks[j], None, {'User-agent' : 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0'}) 
     response = urllib.request.urlopen(req) 
    except urllib.request.HTTPError as inst: 
     brokenlinksflag = 1 
     brokenlinks = articlelinks[j] + ' ' + format(inst) + ', ' + brokenlinks 
     continue 
    except TimeoutError: 
     brokenlinksflag = 1 
     brokenlinks = articlelinks[j] + ' Timeout Error, ' + brokenlinks 
     continue 
    except urllib.error.URLError as inst: 
     brokenlinksflag = 1 
     brokenlinks = articlelinks[j] + ' ' + format(inst) + ', ' + brokenlinks 
     continue 
    except SocketError as inst: 
     brokenlinksflag = 1 
     brokenlinks = articlelinks[j] + ' ' + sys.exc_info()[0] + ', ' + brokenlinks 
     continue 
    except: 
     print("This article killed everything: " + articlelinks[j]) 
     exit() 
+0

вы можете дать нам пример URL, который не? – taesu

+0

http://www.zend.com/ - это URL-адрес, который прерывался с перерывами. –

ответ

2

Решено! Вопрос заключается в том, что я был поиск неисправностей соединения для обработки ConnectionResetError, однако, более тщательное изучение полной ошибки показало, что ошибка была брошена, пытаясь обработать ответ, а не открытие URL:

File "exceptionerror.py", line 97, in <module> 
    raw_response = response.read().decode('utf8', errors='ignore') 

Поскольку соединение было сброшено, а не полностью завершено, скрипт смог успешно открыть URL-адрес, и ошибка была сгенерирована при попытке декодирования ответа, что означает, что условия try/except были связаны с неправильными строками.

Ниже решен вопрос:

try: 
    raw_response = response.read().decode('utf8', errors='ignore') 
except ConnectionResetError: 
    brokenlinksflag = 1 
    brokenlinks = articlelinks[j] + ' ConnectionResetError, ' + brokenlinks 
    continue