我似乎无法捕捉到这个TimeoutError异常。在这个异常中找到的其他主题建议在Python 3中使用“except TimeoutError”,但是它仍然抛出了一个错误。错误日志如下。
我也试过导入 requests 模块,但没有任何效果。假设这是一个简单的修复方法,我就是想不出来。我该怎么修复呢?
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分钟,然后再继续。我不想使用“except 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)
2条答案
按热度按时间amrnrhlw1#
正如我在你帖子下面的评论中所写的,调试可能是有用的。
在我看来,异常发生在列表解析
[x for x in songs.get('*')]
(我假设songs.get()发出了一些请求)中,在try
块之外,这就是您无法处理它的原因。以下代码的输出可能会有所帮助:
如果记录器的最后一条信息消息是“启动for循环”,则有两种可能性:请求是无效的(我猜不太可能),或者实际上需要用time.sleep()来降低代码的速度,或者,如果可能的话,增加超时,在代码中的某个地方传递关键字参数。
ncgqoxb02#
我也遇到过同样的问题,比如循环遍历一个列表并为列表中的每个条目请求数据,这会导致问题中描述的错误,我可以通过下面的except语句解决这个问题:
更多信息:问题中提到的其他三个例外情况分别位于
requests
或urllib3
: