在本例中,我尝试再次激活main()
,以防one()
:中出现错误
from random import randrange
import sys
import time
def one():
number = randrange(2)
1/number
def main():
try:
one()
except:
sleep_time = 0
while True:
print('Error')
sleep_time += 1
print('Next attempt in: '+ str(sleep_time) + ' second(s)')
time.sleep(sleep_time)
main()
sys.exit(1)
print('Continue')
main()
当连续出现两个错误时,它会持续暂停1秒:
Error
Next attempt in: 1 second(s)
Error
Next attempt in: 1 second(s)
Continue
我真正想要的是这样一个答案:
Error
Next attempt in: 1 second(s)
Error
Next attempt in: 2 second(s)
Continue
我应该如何继续?
每次对main
的递归调用都会将sleep_time
覆盖回零。将其指定为函数的参数
def main(sleep_time=0):
try:
one()
except:
while True:
print('Error')
sleep_time += 1
print('Next attempt in: '+ str(sleep_time) + ' second(s)')
time.sleep(sleep_time)
main(sleep_time=sleep_time)
sys.exit(1)
print('Continue')
出
Error
Next attempt in: 1 second(s)
Error
Next attempt in: 2 second(s)
Error
Next attempt in: 3 second(s)
在其他答案中也发现了问题。一种替代的解决方案;美丽的";Frederick的方法是将变量sleep_time
作为输入传递给主函数:
from random import randrange
import sys
import time
def one():
number = randrange(2)
1/number
def main(sleep_time):
try:
one()
except:
while True:
print('Error')
sleep_time += 1
print('Next attempt in: '+ str(sleep_time) + ' second(s)')
time.sleep(sleep_time)
main(sleep_time)
sys.exit(1)
print('Continue')
main(0)
问题是,您总是再次调用主函数,然后将sleep_time
重置为0
,然后再次重置add 1
。无需再次调用即可工作:
from random import randrange
import sys
import time
def one():
number = randrange(2)
1/number
def main():
try:
one()
except:
sleep_time = 0
while True:
print('Error')
sleep_time += 1
print('Next attempt in: '+ str(sleep_time) + ' second(s)')
time.sleep(sleep_time)
print('Continue')
main()
在while
中使用try
将使代码更易于阅读,并可能消除反复调用main()
的需要:
import sys
import time
def one():
raise ValueError("Error!")
def main():
sleep_time = 0
while 1:
try:
one()
except:
sleep_time += 1
print(f'Next attempt in: {sleep_time} second(s)')
time.sleep(sleep_time)
else:
print("Ok. Exit here")
sys.exit(0)
main()
输出:
Next attempt in: 1 second(s)
Next attempt in: 2 second(s)
Next attempt in: 3 second(s)
...