You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:07:45