У меня есть скрипт Python, который содержит большой цикл, читающий файл и выполняющий некоторые действия (я использую несколько пакетов, таких как urllib2, httplib2 или BeautifulSoup).
Это выглядит так:
try:
with open(fileName, 'r') as file :
for i, line in enumerate(file):
try:
# a lot of code
# ....
# ....
except urllib2.HTTPError:
print "\n >>> HTTPError"
# a lot of other exceptions
# ....
except (KeyboardInterrupt, SystemExit):
print "Process manually stopped"
raise
except Exception, e:
print(repr(e))
except (KeyboardInterrupt, SystemExit):
print "Process manually stopped"
# some stuff
Проблема в том, что программа останавливается, когда я нажимаю Ctrl+C, но она не перехватывается ни одним из двух моих исключений KeyboardInterrupt, хотя я уверен, что она в данный момент находится в цикле ( и, таким образом, по крайней мере внутри большой попытки/исключения).
Как это возможно? Сначала я подумал, что это из-за того, что один из пакетов, которые я использую, неправильно обрабатывает исключения (например, используя только «исключение:»), но если бы это было так, мой скрипт не остановился бы. Но скрипт ДЕЙСТВИТЕЛЬНО останавливается, и он должен быть пойман хотя бы одним моим двумя, кроме, верно?
Где я не прав?
Заранее спасибо!
ИЗМЕНИТЬ:
С добавлением предложения finally:
после try-except и печатью трассировки в обоих блоках try-except обычно отображается None
, когда я нажимаю Ctrl+C, но однажды мне удалось чтобы получить это (кажется, что это исходит от urllib2, но я не знаю, является ли это причиной, по которой я не могу поймать KeyboardInterrupt):
Traceback (последний последний вызов):
File "/home/darcot/code/Crawler/crawler.py", line 294, in get_articles_from_file
content = Extractor(extractor='ArticleExtractor', url=url).getText()
File "/usr/local/lib/python2.7/site-packages/boilerpipe/extract/__init__.py", line 36, in __init__
connection = urllib2.urlopen(request)
File "/usr/local/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/local/lib/python2.7/urllib2.py", line 391, in open
response = self._open(req, data)
File "/usr/local/lib/python2.7/urllib2.py", line 409, in _open
'_open', req)
File "/usr/local/lib/python2.7/urllib2.py", line 369, in _call_chain
result = func(*args)
File "/usr/local/lib/python2.7/urllib2.py", line 1173, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/local/lib/python2.7/urllib2.py", line 1148, in do_open
raise URLError(err)
URLError: <urlopen error [Errno 4] Interrupted system call>
NOTE:
Избегайте вложенных TRY-CATCH. - person Yogeesh Seralathan   schedule 12.08.2014finally
и распечатать там трассировку... - person Yoel   schedule 12.08.2014try-except
. - person Yoel   schedule 12.08.2014traceback.print_stack()
? - person Yoel   schedule 12.08.2014None
, мне только однажды удалось получить что-то еще (то, что я добавил в пост), но, как предположил @flammi88, это похоже на проблему JPype. - person Thematrixme   schedule 12.08.2014