在15秒循环后,我在下面的脚本中得到以下KeyError,完美地工作了10个小时。为什么一个关键错误只会在每15秒运行10个小时后出现一次?
ERROR:
Traceback (most recent call last):
File "C:\venderFix.py", line 33, in <module>
if j['results']:
KeyError: 'results'
代码:
import json
import urllib
from pprint import pprint
import time
from arduino import Arduino
vendtime = 0.2
delayTime = 15
searchTerm = 'happy'
A = Arduino('COM3') #This will need to be COM3
A.output([12]) #Output on pin 12
countTweet = 0
#To test Twitter for consistancy
tweet= 0
noTweet= 0
#the infinate loop
while True:
#j contains the JSON we load from the URL
j =json.loads(urllib.urlopen('http://search.twitter.com/search.json?q='+searchTerm+'&result_type=recent&rpp=1&filter:retweets').read())
#Debug JSON from twitter (for faults on the Twitter end or possible GET limit id below 15 seconds per request)
#pprint(j) #needed for debugging only
#find the text and the tweet id
if j['results']:
text = j['results'][0]['text']
id = j['results'][0]['id']
#how many times the Json is complete
tweet+= 1
else:
#How many times the Json is incomplete (sometimes twitter malfunctions. About 0.1 in 100 are broken)
noTweet += 1
#print the text and id to the screen
pprint(text) #needed for debugging only
pprint(id) #needed for debugging only
#to get the existing tweet from before we power on, if the first ID has been stored already (count == 1)
if countTweet != 0: #if countTweet is not equal to 0 then it's not the first tweet
#pprint ("new loop") #needed for debugging only
#if lastID is not equal to ID
if lastID != id:
#Tell Arduino to Vend
#pin 12 HIGH
A.setHigh(12)
#Sleep for the time specified in vendtime
time.sleep(vendtime)
#pin 12 LOW
A.setLow(12)
#Display the tweet that triggered the vend
#pprint(text) #needed for debugging only
#pprint(id) #needed for debugging only
#Make lastID equal to ID so that next time we can compare it
lastID = id
#pprint ('lastID updated') #needed for debugging only
#if no new tweets, print
else: #needed for debugging only
pprint ('no new tweets') #needed for debugging only
#If it's the first loop, confirm by printing to the screen
else:
pprint("First loop complete")
pprint(text)
pprint(id)
lastID = id
pprint(lastID)
countTweet += 1 #Add 1 to countTweet
pprint ('Number of Tweets')
pprint (countTweet)
pprint('Working JSON')
pprint(tweet)
pprint('Broken JSON')
pprint(noTweet)
pprint('waiting')
time.sleep(delayTime)
答案 0 :(得分:5)
只是因为在那次迭代中,results
中没有关键dict
。
测试密钥是否在字典中的正确方法是:
if 'result' in j:
....
如果您还想检查其值是否为None
或任何其他虚假值,则:
if 'result' in j and j['result']:
...
与您正在调用服务这一事实相关的另一个假设是,服务器会不时地返回错误消息。
如果发生这种情况,JSON结构可能不是您所期望的,您应该检查文档是否对此有所说明,并相应地处理它。