2013-09-04 3 views
0

t.cursor() 메서드에서 소수의 ID에 대해 Twython 라이브러리의 예외가 throw됩니다. 그러나 예외가 발생할 때마다 코드가 throw되는 실제 행은 try/except 블록 다음에 나오는 for-loop이므로 continue이 호출되지 않습니다.예외가 잘못된 위치에 표시됩니다.

try 블록에서 예외를 throw하고 except 블록에서 catch하지 않고 나중에 관련없는 대부분의 코드에서 나중에 표시하는 방법은 무엇입니까?

그리고 예, 그것은 401 오류입니다. 그러나 그것은 잘못된 코드를 반환하는 Twitter API 일뿐입니다. 실제로 나는 올바르게 인증하고 있습니다. 또한 for-loop 다음에 except 블록을 옮길 수 있다는 것도 알고 있지만, 어떻게 이런 일이 발생할 수 있는지 알고 싶을뿐입니다.

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)) 

    # ... 

역 추적 : t.cursor(...) 당신이 그것을 반복 될 때까지 실제로 실행하지 않는 발전기를 돌려처럼

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

보인다.

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

for 루프를 사용하여 생성기를 반복 할 때까지는 그렇지 않습니다. 언급 된 종류 here

나중에 처리 할 때까지 처리를 지연해야하지만 여전히 예외를 catch하려면 생성기를 목록으로 바꿉니다. 그러면 발전기가 소진되어 나중에 데이터를 저장할 수 있습니다.

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

은 아마

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

에있어 어떤 목록을 가져옵니다 코드 조각에 커서입니다. 그러나이 커서가 lazy이기 때문에 Twyton 코드가 아직 실행되지 않았습니다. acual fetching 코드는 예외를 throw하는 행에서 처음 사용될 때만 실행됩니다. 그래서 예외 처리에서이를 감 쌉니다.

관련 문제