异常处理 - 通过嵌套或循环重新运行函数?

2 投票
3 回答
2429 浏览
提问于 2025-04-17 12:44

我有一个函数,它经常会出错(通过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

撰写回答