代码之家  ›  专栏  ›  技术社区  ›  jimbotron

异常出现在错误的位置

  •  0
  • jimbotron  · 技术社区  · 11 年前

    在t.cursor()方法中,会为一小部分id抛出来自Twython库的异常。然而,无论何时发生异常,代码中抛出异常的实际行都是try/except块之后的for循环,这会阻止 continue 避免被呼叫。

    异常是如何在try块中抛出的,而不是被except块捕获的,然后在稍后的一些(大部分)不相关的代码中出现的?

    是的,这是一个401错误,但这只是推特API返回了错误的代码。事实上,我的身份验证是正确的。我也知道我可以把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.
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   Brian    11 年前

    看起来像 t.cursor(...) 返回一个生成器,该生成器在您迭代它之前不会实际执行。虽然连接可能发生在:

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

    直到您使用for循环迭代生成器,它才会出现。有点像提到的 here

    如果您需要将处理推迟到以后,但仍想捕获异常,请将生成器转换为列表。这将耗尽发电机的电量,并保存数据以备日后使用。

    followers = t.cursor(t.get_followers_ids, id=id)
    followers = list(followers)
    
        2
  •  0
  •   RickyA    11 年前

    你可能得到了什么

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

    是指向一段代码的光标,该代码将获取您的列表。但因为这个光标 lazy 尚未执行任何Twyton代码。只有在首次使用时才会执行实际提取代码。。。。在抛出异常的行。 所以也将其包含在异常处理中。