我有一个小脚本,使用sixohsix' s重复(每小时)从API获取推文 Twitter Wrapper for Python。我成功处理了大多数(如果不是全部)来自Twitter API的错误,即所有5xx和4xx的内容。
尽管如此,我随机观察了以下错误追溯(仅在2-3天内一次)。我的意思是程序退出并且回溯显示在shell中。我不知道这可能意味着什么,但认为它与我的脚本没有直接关系,因为它证明了自己在大多数情况下正确运行。
这是我在脚本中调用包装器函数的地方:
KW = {
'count': 200, # number of tweets to fetch (fetch maximum)
'user_id' : tweeter['user_id'],
'include_rts': 'false', # do not include native RT's
'trim_user' : 'true',
}
timeline = tw.twitter_request(tw_endpoint,\
tw_endpoint.statuses.user_timeline, KW)
函数tw.twitter_request(tw_endpoint, tw_endpoint.statuses.user_timeline, KW)
基本上是return tw_endpoint.statuses_user_timeline(**args)
,其中args
转换为KW
,而tw_endpoint
是使用sixohsix&#39}获得的OAuthorized端点。图书馆的
return twitter.Twitter(domain='api.twitter.com', api_version='1.1',
auth=twitter.oauth.OAuth(access_token, access_token_secret,
consumer_key, consumer_secret))
这是追溯:
Traceback (most recent call last):
File "search_twitter_entities.py", line 166, in <module>
tw_endpoint.statuses.user_timeline, KW)
File "/home/tg/mild/twitter_utils.py", line 171, in twitter_request
return twitter_function(**args)
File "build/bdist.linux-x86_64/egg/twitter/api.py", line 173, in __call__
File "build/bdist.linux-x86_64/egg/twitter/api.py", line 177, in _handle_response
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1180, in do_open
r = h.getresponse(buffering=True)
File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse
response.begin()
File "/usr/lib/python2.7/httplib.py", line 407, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
raise BadStatusLine(line)
httplib.BadStatusLine: ''
我唯一可以从该回溯中获得的是错误发生在另一个Python库的深处,并且与来自Twitter API或包装器的无效HTTP统计有关...但正如我所说,也许你们中的一些人可以给我一个关于如何调试/解决这个问题的提示,因为经常检查我的脚本并重新启动它以继续获取推文非常烦人。
编辑:为了澄清这一点,回溯中的前两个函数已经在try-except块中。例如,文件中的try-except-Block&#34; twitter_utils.py&#34;过滤掉40x和50x异常,但也只查找except:
的一般异常。所以我不明白为什么错误不会被抓到这个位置,相反,程序是强制关闭并打印回溯?简而言之,我处于无法捕获错误的情况,就像PHP脚本中的解析错误一样。那我该怎么做呢?
答案 0 :(得分:0)
也许这会指出你正确的方向。这是调用BadStatusLine时调用的内容:
class BadStatusLine(HTTPException):
def __init__(self, line):
if not line:
line = repr(line)
self.args = line,
self.line = line
我对httplib并不太熟悉,但是如果我不得不猜测,那么你会得到一个空的响应/错误行,而且它无法被解析。在程序停止的行之前有评论:
# Presumably, the server closed the connection before
# sending a valid response.
raise BadStatusLine(line)
如果twitter在发送回复之前关闭了连接,您可以再试一次,这意味着在“search_twitter_entities.py”,第166行尝试一下/几次(丑陋)。
try:
timeline = tw.twitter_request(tw_endpoint,\
tw_endpoint.statuses.user_timeline, KW)
except:
try:
timeline = tw.twitter_request(tw_endpoint,\
tw_endpoint.statuses.user_timeline, KW) # try again
except:
pass
或者,假设您每次都可以将时间轴重新分配为无,请执行while循环:
timeline = None
while timeline == None:
try:
timeline = tw.twitter_request(tw_endpoint,\
tw_endpoint.statuses.user_timeline, KW)
except:
pass
我没有对此进行测试。检查代码是否错误。