python-3.x 正在捕获异常“TimeoutError”

3htmauhk  于 2022-12-20  发布在  Python
关注(0)|答案(2)|浏览(316)

我似乎无法捕捉到这个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)
amrnrhlw

amrnrhlw1#

正如我在你帖子下面的评论中所写的,调试可能是有用的。
在我看来,异常发生在列表解析[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循环”,则有两种可能性:请求是无效的(我猜不太可能),或者实际上需要用time.sleep()来降低代码的速度,或者,如果可能的话,增加超时,在代码中的某个地方传递关键字参数。

ncgqoxb0

ncgqoxb02#

我也遇到过同样的问题,比如循环遍历一个列表并为列表中的每个条目请求数据,这会导致问题中描述的错误,我可以通过下面的except语句解决这个问题:

except requests.exceptions.ConnectionError as err:
    print(err)

更多信息:问题中提到的其他三个例外情况分别位于requestsurllib3

  • urllib3.exceptions.MaxRetryError
  • urllib3.exceptions.NewConnectionError
  • requests.exceptions.Timeout

相关问题