我有一个经常抛出异常的函数(SSH超过3g)。
我想继续尝试每10秒运行一次function()
,直到成功为止(不会抛出异常)。
我认为,有两种选择:
嵌套:
def nestwrapper():
try:
output = function()
except SSHException as e:
# Try again
sleep(10)
return nestwrapper()
return output
循环:(已更新)
有人指出,以前的循环代码是非常不必要的。
def loopwrapper():
while True:
try:
return function()
except SSHException as e:
sleep(10)
有这样做的首选方法吗?
嵌套和异常堆栈是否存在问题?
答案 0 :(得分:3)
我会在这里找到一个更清洁,更高效的循环。如果这是一个自动化作业,递归方法可能会达到python递归限制(默认值为1000 iirc,可以使用sys.getrecursionlimit()
进行检查。)
不要将status is False
用于表达式,因为这是一种身份比较。使用while not status
。
我可能也会略微区别地实现它,因为我认为这里不需要这两个不同的函数:
def function_with_retries():
while True:
try:
output = function()
except SSHException:
sleep(10)
else:
return output
答案 1 :(得分:1)
我不确定两次特别包装函数调用会有多大意义。异常可能是合理的,并且您将进行重试特定异常的额外步骤。我的意思是try / except与重试循环密切相关。
这是我通常这样做的方式:
def retry_something():
while True:
try:
return something()
except SomeSpecialError:
sleep(10)
while True:
正是你所要做的,你将永远循环,或者更确切地说,直到你真正设法something()
,然后返回。没有进一步需要布尔标志的成功,这由return语句的正常情况表示(礼貌地逃避循环)。
答案 2 :(得分:0)
保持简单。
function looper(f):
while 1:
try:
return f()
except SSHException, e:
sleep(10)
output = looper(<function to call>)