在调用堆栈深处的第3方库中发生的异常捕获问题

时间:2019-05-24 17:59:07

标签: python python-3.x exception python-requests

我正在使用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()

感谢并期待学习!

1 个答案:

答案 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() 时的错误堆栈跟踪吗?因为这里似乎有些事。