Python双层while循环中try-except重试逻辑的执行机制咨询
代码执行逻辑验证结论
你对成功拉取场景下的代码执行流程理解完全正确,以下是全场景的实际运行规则说明:
正常无异常场景流程
和你描述的逻辑完全一致:
- 外层
while True常驻循环启动后,首先初始化重试计数try_cnt = 10,进入内层重试循环 - 调用
get_current_price(symbol)成功获取价格后,执行打印操作,随后time.sleep(1)等待1秒 - 手动将
try_cnt置为0,执行break跳出内层重试循环 - 回到外层
while True下一轮迭代,先执行定时任务判断,再重置try_cnt=10,重新进入内层循环拉取价格,持续循环运行
异常触发重试场景流程
这部分是你之前的理解没有覆盖到的分支:
- 接口调用抛出异常被捕获后,会打印错误信息,将
try_cnt减1,不会触发等待逻辑,直接进入内层循环的下一轮重试 - 如果连续10次调用全部失败,
try_cnt会递减到0,内层循环条件不满足自动退出,回到外层while True进入下一轮,再次重置try_cnt=10开启新一轮10次重试
现有代码的异常分支没有设置重试间隔,接口连续报错时会瞬间打完10次重试,很容易触发交易所接口的限流规则,建议在
except块中增加短等待,比如time.sleep(0.2)
带定时任务的版本注意事项
你写的零点触发functionA的逻辑存在漏触发风险:
- 如果内层重试过程刚好跨过零点,或是
time.sleep(1)的等待时间覆盖了零点整的那1秒,定时判断条件就会被错过,任务不会执行 - 如果对定时任务触发精度要求不高可以保留现状,精度要求高的话建议把定时任务拆到单独线程运行,不要和价格拉取逻辑共用同一个事件循环
内容的提问来源于stack exchange,提问作者jy2da
相关产品推荐
相关产品推荐

