0

我正在使用 Python Requests 模块来使用 Twitter 流 API,这是我的代码:

self.conn = self.session.post(url, data=self.parameters, headers=self.headers)
    print >> sys.stderr, 'Connected to Twitter Streaming API'
    try:
        for line in self.conn.iter_content(self.ITER_BYTES):
            self.status += line
            if line.endswith(self.DIVIDER) and self.status.strip():
                self.handler.handle(self.status)
                self.status = ""
    except Exception as e:
        pass

当我使用 KeyboardInterrupt 或通过向其传递终止信号结束此脚本时,我收到以下堆栈错误:

^CTraceback (most recent call last):
  File "python-test.py", line 18, in <module>
    api.start()
  File "bin/polygraph/api/twitter/streaming.py", line 95, in start
    self.conn = self.session.post(url, data=self.parameters, headers=self.headers)
  File "venv/lib/python2.7/site-packages/requests/sessions.py", line 258, in post
    return self.request('post', url, data=data, **kwargs)
  File "venv/lib/python2.7/site-packages/requests/sessions.py", line 208, in request
    r.send(prefetch=prefetch)
  File "venv/lib/python2.7/site-packages/requests/models.py", line 575, in send
    timeout=self.timeout,
  File "venv/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 383, in urlopen
    body=body, headers=headers)
  File "venv/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 261, in _make_request
    httplib_response = conn.getresponse()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1013, in getresponse
    response.begin()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 402, in begin
    version, status, reason = self._read_status()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 360, in _read_status
    line = self.fp.readline()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 430, in readline
    data = recv(1)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 219, in recv
    return self.read(buflen)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 138, in read
    return self._sslobj.read(len)
KeyboardInterrupt

有什么办法可以避免这种情况或优雅地退出连接?

4

1 回答 1

2

您只需要捕获 KeyboardInterrupt 异常。这不是从 Exception 继承的,因此您当前没有捕获它。

try:
   do_something()
except KeyboardInterrupt:
   cleanup()

这是另一个为什么except Exception是一个坏主意的例子。它不仅会捕捉到你不希望它捕捉到的东西,而且它可能不会捕捉到你想要它捕捉到的东西。捕获显式异常。

于 2012-04-13T14:40:02.883 回答