捕捉超时错误

时间:2018-09-04 03:39:09

标签: python-3.x

我似乎无法捕捉到此TimeoutError。在此找到的其他主题建议对Python3使用“ TimeoutError除外”,但仍会引发错误。错误日志如下。还尝试导入没有任何区别的请求模块。假设这是一个简单的解决方法,那就无法解决。有什么想法吗?

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 141, in _new_conn
    (self.host, self.port), self.timeout, **extra_kw)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/util/connection.py", line 83, in create_connection
    raise err
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/util/connection.py", line 73, in create_connection
    sock.connect(sa)
TimeoutError: [Errno 60] Operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 345, in _make_request
    self._validate_conn(conn)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 844, in _validate_conn
    conn.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 284, in connect
    conn = self._new_conn()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 150, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x106f3dd68>: Failed to establish a new connection: [Errno 60] Operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 649, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/packages/urllib3/util/retry.py", line 376, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.spotify.com', port=443): Max retries exceeded with url: /v1/artists/090VebphoycdEyH165iMqc (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x106f3dd68>: Failed to establish a new connection: [Errno 60] Operation timed out',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "populate2.py", line 130, in <module>
    r = s.get_artist(a['uri'])
  File "/Users/tapoffice/Google Drive/OSCAR SIDEBO/Programming/Python/Spotify/spotify_handler.py", line 44, in get_artist
    search = self.spotifyHandler.artist(uri)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/spotipy/client.py", line 244, in artist
    return self._get('artists/' + trid)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/spotipy/client.py", line 146, in _get
    return self._internal_call('GET', url, payload, kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/spotipy/client.py", line 108, in _internal_call
    r = self._session.request(method, url, headers=headers, proxies=self.proxies, **args)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 487, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.spotify.com', port=443): Max retries exceeded with url: /v1/artists/090VebphoycdEyH165iMqc (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x106f3dd68>: Failed to establish a new connection: [Errno 60] Operation timed out',))

这是实际运行的脚本。基本上,它会遍历数据库请求的列表,并执行API请求以收集信息,然后将其添加回数据库中。我意识到这个问题的根源在于它超出了api的速率限制,因此解决方案是允许脚本休眠1分钟再继续。我不想使用“ Exception除外”,因为我可能会遗漏其他错误。下面的脚本无法捕获TimeoutError,这是我不理解的。

for a in [x for x in songs.get('*')]:
    try:
        r= s.get_track(a['uri'])
        pop= r['popularity']
        songupdates.add_row(['song_id','popularity'],[str(a['id']),str(pop)])

    except TimeoutError:
        print("TimeoutError, sleeping 1 minute.")
        time.sleep(60)

1 个答案:

答案 0 :(得分:0)

正如我在帖子下方的评论中所写的那样,调试可能会有用。

我认为,例外情况发生在列表理解[x for x in songs.get('*')]中(我假设songs.get()发出了一些请求),位于try块之外,这就是您无法处理它的原因

能否请您尝试以下代码并告诉我输出内容?

import logging

logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('my_app.log')
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

try:
    logger.info('Starting for-loop')
    for a in songs.get('*'):
        logger.info('Getting song track')
        r = s.get_track(a['uri'])
        pop= r['popularity']
        logger.info('Adding a row')
        songupdates.add_row(['song_id','popularity'],[str(a['id']),str(pop)])
except Exception:
    logger.error('An error occurred', exc_info=True)

如果记录器的最后一条信息消息是``正在启动for循环'',则有两种可能性:请求无效(我想这不太可能),或者实际上需要随着时间的流逝降低代码的速度。 (),或者在可能的情况下增加超时时间,将关键字参数传递到代码中的某个地方。

对不起,由于我不了解其余代码,因此无法为您提供进一步帮助。希望对您有帮助。 如果需要,可以与我联系。您可以在我的个人资料中找到我的电子邮件。

致谢。