如何使用pycurl很好地处理KeyboardInterrupt(Ctrl-c)?

Woo*_*kai 7 python curl pycurl twitter-streaming-api

我正在编写一个Python脚本,pycurl用于使用Twitter的Sreaming API.这是一个简短的代码片段(只需将您的Twitter登录名/密码进行测试):

import pycurl

user = 'USER'
password = 'PWD'

def handleData(data):
    print(data)

conn = pycurl.Curl()  
conn.setopt(pycurl.USERPWD, "%s:%s" % (user, password))  
conn.setopt(pycurl.URL, 'https://stream.twitter.com/1/statuses/sample.json')  
conn.setopt(pycurl.WRITEFUNCTION, handleData)
conn.perform()
Run Code Online (Sandbox Code Playgroud)

问题是因为脚本使用流,所以conn.perform()永远不会返回(或很少).因此,我有时需要中断脚本,并且KeyboardInterruptperform()方法捕获.

但是,它不能很好地处理它,打印出一个丑陋的错误,并引发一个不同的异常.

^CTraceback (most recent call last):
  File "test.py", line 6, in handleData
    def handleData(data):
KeyboardInterrupt
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    conn.perform()
pycurl.error: (23, 'Failed writing body (0 != 2203)')
Run Code Online (Sandbox Code Playgroud)

卷曲FAQ说,中断正在进行的转移,回调函数(在我的情况handleData),应返回的特殊值.这很棒,但是KeyboardInterrupt没有被任何回调功能捕获!

我怎么能整齐地做到这一点?

编辑:我知道你可以捕获异常,但pycurl仍然做一些有趣的事情:

如果我做:

try:
    conn.perform()
except BaseException as e:
    print('We caught the exception')
    print(type(e))
Run Code Online (Sandbox Code Playgroud)

我明白了:

^CTraceback (most recent call last):
  File "test.py", line 6, in handleData
    def handleData(data):
KeyboardInterrupt
We caught the exception
<class 'pycurl.error'>
Run Code Online (Sandbox Code Playgroud)

这意味着在内部,pycurl做某种捕获,打印一个丑陋的错误消息,然后提出一个pycurl.error.

Car*_*son 1

您可以通过捕获 pycurl.error 类型来完成此操作。前任:

try:
    conn.perform()
except pycurl.error, e:
    errorCode, errorText = e.args
    print 'We got an error. Code: %s, Text:%s'%(errorCode, errorText)
Run Code Online (Sandbox Code Playgroud)