背景:我想从twitter api下载用户推特的特定部分(例如用户名,ID,扩展网址等)。我能够成功地做到这一点。
问题:由于并非所有用户都有expanded_url
,我有时会收到以下错误:
IndexError: list index out of range
目标:如果发生此类IndexError
,请跳过并继续收集新推文
我认为解决此问题的一种方法是使用try / except语句
问题: try / except语句是实现此目标的有效方法吗?如果是这样,我如何正确应用try / except语句?
我尝试了以下内容:
class StdOutListener(StreamListener):
def on_data(self, data):
t = json.loads(data)
tweet_id = t['id_str']
user_name = t['user']['name']
try:
expanded_url = t['entities']['urls'][0]['expanded_url']
except:
pass
但是我收到以下错误:
UnboundLocalError: local variable 'expanded_url' referenced before assignment
我搜索了SO,并提供了一些类似于我的问题的示例(UnboundLocalError: local variable 'url_request' referenced before assignment,UnboundLocalError: local variable 'url' referenced before assignment)
但我不确定如何直接更改我的代码,以便我可以实现try / except语句。 我也对其他解决这个问题的方法持开放态度。 谢谢!
答案 0 :(得分:2)
当try内部的块出错时,except内的块被执行。如果你的除外没有任何反应(它只通过),则永远不会定义expanded_url。您应该将except块中的expanded_url分配给默认值或空字符串,无论它应该是什么:
try:
expanded_url = t['entities']['urls'][0]['expanded_url']
except:
expanded_url = ''
答案 1 :(得分:0)
问题是您可能尝试在$arr = $this->createQueryBuilder('ad')
->select('ad.extId')
->where('ad.extId is not NULL')
->getQuery()
->getArrayResult();
return array_map(function($a){ return $a['extId']; }, $arr);
块之后使用expanded_url
,但是当您的代码抛出异常时,您不会创建变量。尝试:
try/except
或者:
expanded_url = ''
try:
expanded_url = ....
except:
pass