2013-09-04 2 views
0

В методе t.cursor() исключение из библиотеки Twython выбрасывается за небольшой процент идентификаторов. Однако всякий раз, когда возникает исключение, фактическая строка в моем коде, где она была выбрана, представляет собой цикл for, который приходит после блока try/except, который предотвращает вызов continue.Исключение появляется в неправильном месте

Каким образом исключение может быть выбрано в блоке try, а не обнаружено за исключением блока, а затем появится позже в течение некоторого (в основном) несвязанного кода?

И да, это ошибка 401, но это только API Twitter, возвращающий неправильный код. На самом деле я правильно аутентифицируюсь. Я также знаю, что могу просто переместить блок except после цикла for, но я просто хочу знать, как это может произойти вообще.

from twython import Twython 
t = Twython(...) 

# ... 

for id in ids: 
    try: 
     # exception is truly caused by the following line 
     followers = t.cursor(t.get_followers_ids, id=id) 
    except: 
     # this block is never run 
     print("Exception with user " + str(id)) 
     continue 

    # this line actually throws the exception, inexplicably 
    for follower_id in followers: 
     values.append((follower_id, id, scrape_datetime)) 

    # ... 

отслеживающий:

Traceback (most recent call last): 
File "/root/twitter/nightly.py", line 5, in <module> 
    t.get_followers(t.current_tweeters) 
File "/root/twitter/tweets.py", line 81, in get_followers 
    for follower_id in followers: 
File "/usr/local/lib/python3.3/dist-packages/twython-3.0.0-py3.3.egg/twython/api.py", line 398, in cursor 
content = function(**params) 
File "/usr/local/lib/python3.3/dist-packages/twython-3.0.0-py3.3.egg/twython/endpoints.py", line 212, in get_followers_ids 
return self.get('followers/ids', params=params) 
File "/usr/local/lib/python3.3/dist-packages/twython-3.0.0-py3.3.egg/twython/api.py", line 231, in get 
return self.request(endpoint, params=params, version=version) 
File "/usr/local/lib/python3.3/dist-packages/twython-3.0.0-py3.3.egg/twython/api.py", line 225, in request 
content = self._request(url, method=method, params=params, api_call=url) 
File "/usr/local/lib/python3.3/dist-packages/twython-3.0.0-py3.3.egg/twython/api.py", line 195, in _request 
retry_after=response.headers.get('retry-after')) 
twython.exceptions.TwythonAuthError: Twitter API returned a 401 (Unauthorized), An error occurred processing your request. 

ответ

1

Похоже t.cursor(...) возвращает генератор, который на самом деле не выполнять до тех пор, пока итерацию через него. Хотя это может показаться, что соединение происходит по адресу:

followers = t.cursor(t.get_followers_ids, id=id) 

Это не пока вы не перебирать генератор с вашей цикл. Упомянутые here

Если у вас есть необходимость отложить обработку до конца, но все же хотите поймать исключение, включите генератор в список. Это приведет к выходу генератора и сохранению данных для последующего использования.

followers = t.cursor(t.get_followers_ids, id=id) 
followers = list(followers) 
0

То, что вы, вероятно, получил с

followers = t.cursor(t.get_followers_ids, id=id) 

является курсор на кусок кода, который будет получать список. Но поскольку этот курсор lazy, код Twyton еще не выполнен. Экземпляр для получения кода выполняется только тогда, когда он впервые используется ... в строке, которая выдает исключение. Так что оберните это в обработку исключений.

Смежные вопросы