重试函数的Python函数不起作用

问题描述 投票:0回答:2

我正在测试一个简单的功能,以便在引发特定异常时重试某些 python 函数。但是我的 except 块没有捕获我的异常,我不明白为什么。

import random

list1 = [1, 2, 3, 4, 5, 6]

def retry(fun, max_tries=10):
    for i in range(max_tries):
        try:
           fun()
           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))

鉴于此代码,我希望在数字匹配时该函数将退出,并且我应该只看到显示匹配的输出。如果不匹配,则会引发异常,并且 for 循环的下一次迭代将继续。但是,如果不匹配,异常会导致脚本退出并且不会移至下一次迭代,如下所示:

NO MATCH -- Chosen: 6, Target: 4
Traceback (most recent call last):
  File "test.py", line 22, in <module>
    retry(generate_number(list1, 4))
  File "test.py", line 20, in generate_number
    raise RuntimeError("Chosen and target numbers do not match.")
RuntimeError: Chosen and target numbers do not match.

如您所见,由于某种原因,我的 except 没有捕获此异常。

此外,这才是真正让我陷入循环的原因,在比赛中,即使break应该立即结束for循环,也会抛出TypeError。

MATCH -- Chosen: 4, Target: 4
Traceback (most recent call last):
  File "test.py", line 22, in <module>
    retry(generate_number(list1, 4))
  File "test.py", line 8, in retry
    fun()
TypeError: 'NoneType' object is not callable
python exception retry-logic
2个回答
0
投票

retry(generate_number(list1, 4))
并没有按照你的想法去做。您没有重试函数
generate_number
作为参数,而是给出
generate_number(list1, 4)
的输出。

retry(generate_number(list1, 4))
更改为
retry(generate_number)
,并将
fun()
更改为
fun(list1, 4)

进行上述更改后的示例输出:

NO MATCH -- Chosen: 2, Target: 4
Except is working
NO MATCH -- Chosen: 6, Target: 4
Except is working
MATCH -- Chosen: 4, Target: 4

0
投票

您需要使用部分求值函数。正如您所写的,您没有将函数传递给重试,而是将

generate_number
函数调用的结果传递给它。

© www.soinside.com 2019 - 2024. All rights reserved.