异常处理 - 通过嵌套或循环重新运行函数?
我有一个函数,它经常会出错(通过3G进行SSH连接)。
我想每隔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)
有没有更好的方法来实现这个?
嵌套和异常堆栈之间有没有什么问题?
3 个回答
0
保持简单。
function looper(f):
while 1:
try:
return f()
except SSHException, e:
sleep(10)
output = looper(<function to call>)
1
我觉得把函数调用特别包裹两次其实没什么太大意义。处理异常的做法可能是合理的,你还额外尝试在特定的异常上重试。我的意思是,try/except和重试循环是紧密相关的。
我通常是这样做的:
def retry_something():
while True:
try:
return something()
except SomeSpecialError:
sleep(10)
while True:
这段代码正是你想要的,它会一直循环,直到你成功执行 something()
,然后返回。其实不需要再用一个布尔值来表示成功与否,因为正常情况下返回语句就能表明成功(它会礼貌地退出循环)。
3
我觉得用循环会更简洁、更高效。如果这是一个自动化的任务,递归的方法可能会碰到 Python 的递归限制(默认是 1000,没记错的话,可以用 sys.getrecursionlimit()
来检查)。
不要用 status is False
来判断,因为这是在比较身份。应该用 while not status
。
我可能会稍微不同地实现这个,因为我觉得这里没有必要用两个不同的函数:
def function_with_retries():
while True:
try:
output = function()
except SSHException:
sleep(10)
else:
return output