I am using the Python Requests module to consume the Twitter streaming API, here is my code:
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
When I end this script with a KeyboardInterrupt or by passing it a termination signal, I am getting the following stack error:
^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
Is there any way to avoid this or gracefully exit from the connection?
You simply need to catch the KeyboardInterrupt exception. This does not inherit from Exception, hence you don’t currently catch it.
This is another example of why
except Exceptionis a bad idea. Not only will it catch things you didn’t intend it to, but it may not catch things you wanted it to. Catch explicit exceptions.