Python重试函数异常未捕获及TypeError问题排查求助
Python重试函数问题分析与解决
问题原因分析
问题1:RuntimeError未被捕获直接退出
调用retry(generate_number(list1, 4))时,generate_number(list1,4)会立即执行,而非作为函数对象传入retry。此时若抛出RuntimeError,异常发生在retry函数调用之前,根本没进入retry内部的try-except块,自然无法被捕获触发重试。
问题2:匹配时触发TypeError
当数字匹配时,generate_number执行完成后无显式返回值,默认返回None。此时传给retry的fun参数是None,在retry中执行fun()就会触发TypeError: 'NoneType' object is not callable。
解决方法
核心是要传递可调用的函数对象给retry,而非函数执行后的结果,以下两种方式均可解决:
方法1:用lambda包装函数调用
修改retry的调用代码,通过lambda把带参数的函数调用包装成无参可调用对象:
retry(lambda: generate_number(list1, 4))
方法2:修改retry函数支持传递参数
让retry函数接收函数及对应参数,内部调用时传入参数,灵活性更高:
import random list1 = [1, 2, 3, 4, 5, 6] def retry(fun, *args, max_tries=10, **kwargs): for i in range(max_tries): try: fun(*args, **kwargs) break except RuntimeError: print("Except is working") continue def generate_number(number_list, target_number): chosen_number = random.choice(number_list) if chosen_number == target_number: print(f"MATCH -- Chosen: {chosen_number}, Target: {target_number:}") else: print(f"NO MATCH -- Chosen: {chosen_number}, Target: {target_number:}") raise RuntimeError("Chosen and target numbers do not match.") # 调用方式 retry(generate_number, list1, 4)
修改后:
- 问题1:函数调用延迟到retry内部的try块执行,抛出的RuntimeError会被except捕获,触发重试流程
- 问题2:传给retry的是
generate_number函数对象而非执行结果,避免了NoneType调用错误
内容的提问来源于stack exchange,提问作者ddNip
相关产品推荐
相关产品推荐

