我正在使用API来收集网站的大量统计信息,但是一旦达到该速度,网站就会限制通过关闭连接来从服务器提取数据的速度(通常会提高{{1} },但有时会引发其他与连接有关的错误,例如超时)。
我试图解决此问题的方法是围绕第3方库函数构建包装器,该包装器打开连接并提取数据。函数requests.exceptions.ConnectionError
在下面,但是基本上每次调用此函数时,我都会使用try语句查看是否可以提取数据,并使用except子句捕获任何异常,等待5秒钟,然后递归重试(5次尝试)。问题在于它似乎并没有捕获到异常。
PS“ while True”语句只是向网站发送垃圾邮件一秒钟以获取错误信息...我知道这实际上不是一个好主意
try_request()
和from nba_api.stats.endpoints import *
from nba_api.stats.static import players
from nba_api_helpers import try_request
active_players = players.get_active_players()
for player in active_players:
if player['full_name'] == 'Stephen Curry':
while True:
dummy = try_request(commonplayerinfo.CommonPlayerInfo(player['id']))
print('success')
函数位于另一个文件中:
try_request()
如果我在如下所示的顶级代码周围放置try / except,它将捕获异常,但这不是我要执行的操作,因为我需要重试失败的函数。
这是我经常得到的错误代码的一个例子……我想这会被我的def try_request(api_call, number_tries=5):
sleep_time = 5
tries_left = number_tries
if tries_left == 1:
print("Final try...")
return api_call
else:
try:
api_call
except:
print("Caught exception in Endpoint request... Waiting {} seconds to try again".format(sleep_time))
time.sleep(sleep_time)
try_request(api_call, tries_left-1)
函数的except子句所捕获,但是没有被发现
try_request()
感谢并期待学习!
答案 0 :(得分:0)
我不建议像您一样使用递归策略。您是否尝试过循环?也许是这样的:
def try_request(api_call_function, number_tries=5, sleep_seconds=5):
for i in range(number_tries):
try:
return api_call_function()
except Exception as ex:
print('try', i)
print(ex)
time.sleep(sleep_seconds)
# choose a default return value for the case when the API call
# failed the max number of tries
return None
并尝试捕获一个显式的异常类并进行打印,以便您可以看到引发的错误类型。空的except
子句(如您在问题中显示的那样)有隐藏其他可能发生的错误的危险。
这对您有帮助吗?
将错误stacktrace编辑为问题之后,我注意到您的try_request()
函数似乎没有被调用,因为它没有出现在您的stacktrace中(请注意它如何从文件{{1} },直接访问第三方NBA库C:/Users/jaked/PycharmProjects/NBA/src/classes/scratch.py
。
C:\Users\jaked\AppData\Local\Programs\Python\Python37\lib\site-packages\nba_api\stats\endpoints\commonplayerinfo.py
您确定这是使用函数Traceback (most recent call last):
File "C:/Users/jaked/PycharmProjects/NBA/src/classes/scratch.py", line 13, in <module>
dummy = try_request1(commonplayerinfo.CommonPlayerInfo(player['id']))
File "C:\Users\jaked\AppData\Local\Programs\Python\Python37\lib\site-packages\nba_api\stats\endpoints\commonplayerinfo.py", line 32, in __init__
self.get_request()
时的错误堆栈跟踪吗?因为这里似乎有些事。