Python多条件异常处理的嵌套递归

3

我有三个条件C1、C2、C3需要检查。如果C1出现超时异常,则尝试C2。如果C2出现超时异常,则尝试C3。如果C3出现超时异常,则在函数中返回None。但是如果C1、C2或C3任何一个成功,执行函数中剩余的代码。

我使用了如下嵌套的try catch块,但不确定这是否是正确的方式。请建议最佳的Pythonic方法。

def func():
  try:
    C1
  except:
    try:
      C2
    except:
      try:
        C3
      except:
         return None
  
  try:
    ** Rest of the Code **
    return someValue
  except:
    return None
3个回答

1
**You can follow this approach**
def func():
    if CheckC1() or CheckC2() or CheckC3() :
        try:
        ** Rest of the Code **
            return someValue
        except:
            return None
    return None

def CheckC1():
    try:
        C1
        return true
    except:
        return false

def CheckC2():
    try:
        C2
        return true
    except:
        return false

def CheckC3():
    try:
        C3
        return true
    except:
        return false

    
        

这个比OP最初的解决方案有更多的重复代码。 - S.B
1
虽然所有的解决方案都是正确的,但我选择接受这个答案,因为它看起来是最简洁的方法,特别是当条件数量增加并且每个条件都有一个相关联的操作时。 - Rakesh Agarwal

1
我认为根据EAFP,你做得很好。
而且我认为你也可以使用装饰器。
def C1(func):
    def wrapper():
        try:
            raise Exception('spam', 'eggs')
            print("C1")
            
            print("C1")
        except:
            return func()
            
    return wrapper

def C2(func):
    def wrapper():
        try:
            
            print("C2")

            print("C2")
        except:
            return func()
    return wrapper

def C3(func):
    def wrapper():
        try:
             
            print("C3")

            print("C3")
        except:
            return func()
    return wrapper

@C1
@C2
@C3
def myFunc():
    return 'hi'



myFunc()

输出:

C2
C2

1
我建议使用for循环来完成它:
def func():
    for c in (C1, C2, C3):
        try:
            c
            break
        except Your_Exception_Here:
            continue
    else:
        return None

    # Rest of the code

只有当所有三个条件都引发异常时,for循环的else部分才会被执行。如果其中任何一个成功,则for循环终止并执行其余代码。


虽然这种方法看起来比其他方法更简洁,但考虑到C1、C2、C3可能是多行长条件,并将它们放入for循环中可能会变得复杂,所以不确定是否是一个好的方法。 - Rakesh Agarwal
@RakeshAgarwal 你可以将它们封装在一个函数中,这样 C1C2 等就成为函数引用,并在循环中再次调用该函数。c() - S.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接