我正在测试一个简单的功能,以便在引发特定异常时重试某些 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
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
您需要使用部分求值函数。正如您所写的,您没有将函数传递给重试,而是将
generate_number
函数调用的结果传递给它。