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

时间:2012-02-10 04:18:40

标签: python exception-handling while-loop nested-loops

我有一个经常抛出异常的函数(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)

有这样做的首选方法吗?

嵌套和异常堆栈是否存在问题?

3 个答案:

答案 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>)