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

Python 异常处理-通过嵌套或循环再次运行函数?,python,exception-handling,while-loop,nested-loops,Python,Exception Handling,While Loop,Nested Loops,我有一个函数,它经常通过3g抛出异常SSH 我希望继续尝试每10秒运行一次函数,直到它成功并没有抛出异常为止 在我看来,有两种选择: 嵌套: 循环:更新 有人指出,前面的循环代码是非常不必要的 def loopwrapper(): while True: try: return function() except SSHException as e: sleep(10) 有没有更好的方法 嵌套和异常堆栈有问

我有一个函数,它经常通过3g抛出异常SSH

我希望继续尝试每10秒运行一次函数,直到它成功并没有抛出异常为止

在我看来,有两种选择:

嵌套:

循环:更新

有人指出,前面的循环代码是非常不必要的

def loopwrapper():
    while True:
        try:
            return function()
        except SSHException as e:
            sleep(10)
有没有更好的方法


嵌套和异常堆栈有问题吗?

我发现这里的循环更干净、更有效。如果这是一个自动化作业,递归方法可能会达到python递归限制默认值为1000 iirc,可以使用sys.getrecursionlimit进行检查

不要对表达式使用status is False,因为这是身份比较。使用而不是状态

我可能也会以稍微不同的方式实现它,因为我认为这里不需要两个不同的函数:

def function_with_retries():
  while True:
    try:
      output = function()
    except SSHException:
      sleep(10)
    else:
      return output

我会在这里找到一个更干净、更高效的循环。如果这是一个自动化作业,递归方法可能会达到python递归限制默认值为1000 iirc,可以使用sys.getrecursionlimit进行检查

不要对表达式使用status is False,因为这是身份比较。使用而不是状态

我可能也会以稍微不同的方式实现它,因为我认为这里不需要两个不同的函数:

def function_with_retries():
  while True:
    try:
      output = function()
    except SSHException:
      sleep(10)
    else:
      return output
保持简单

function looper(f):
    while 1:
        try:
            return f()
        except SSHException, e:
            sleep(10)

output = looper(<function to call>)
保持简单

function looper(f):
    while 1:
        try:
            return f()
        except SSHException, e:
            sleep(10)

output = looper(<function to call>)

我不确定专门包装函数调用两次是否有意义。该异常可能是合理的,并且您将对该特定异常进行额外的重试。我的意思是try/except与重试循环紧密相关

我通常是这样做的:

def retry_something():
    while True:
        try:
            return something()
        except SomeSpecialError:
            sleep(10)

虽然这是真的:这正是你要做的,你将永远循环,或者更确切地说,直到你真正做到了,然后返回。不需要再使用成功的布尔标志,返回语句的正常情况表明了这一点,它礼貌地跳出了循环。

我不确定专门包装函数调用两次是否有意义。该异常可能是合理的,并且您将对该特定异常进行额外的重试。我的意思是try/except与重试循环紧密相关

我通常是这样做的:

def retry_something():
    while True:
        try:
            return something()
        except SomeSpecialError:
            sleep(10)

虽然这是真的:这正是你要做的,你将永远循环,或者更确切地说,直到你真正做到了,然后返回。不再需要布尔型的成功标志,返回语句的正常情况表明了这一点,它礼貌地跳出了循环。

获取异常实例句柄的首选方法是使用as关键字:exception as inst。我想这是为了避免在元组中检查多个异常类型的语法混乱。@wim我同意,因为它更像python,我从原来的问题中剪切粘贴了出来。@wim你是对的,从2.6开始。干杯获取异常实例句柄的首选方法是使用as关键字:exception as inst。我想这是为了避免在元组中检查多个异常类型时语法混乱。@wim我同意,因为更像python,我从原始问题中剪切并粘贴。@wim从2.6开始,您是对的。干杯感谢您提供有关sys.getrecursionlimit的信息!感谢您提供有关sys.getrecursionlimit的信息!