运行几个命令,直到异常没有发生? (蟒蛇)

时间:2013-05-26 06:59:01

标签: python exception

通常,try / except块可用于运行一堆语句,直到其中一个语句导致异常。

我想做相反的事情 - 运行一组语句,其中每个语句可能会导致异常,但其中一个不会。

这是一些伪代码:

try:
    c = 1 / 0       # this will cause an exception
    c = 1 / (1 - 1) # this will cause an exception
    c = int("i am not an integer") 
                    # this will cause an exception
    c = 1           # this will not cause an exception
    c = 2           # this statement should not be reached
    c = None        # this would be a final fallback in case everything exceptioned

print c         # with this code, c should print "1"

我想要使用这样的方式是使用数据解析。用户可以提供一些可以是几种不同格式之一的数据。如果数据与格式不匹配,则尝试解析各种格式将产生异常。可能存在数十种不同的可能格式。这些陈述将按优先顺序列出。只要其中一个解析器成功,那就是我想要的变量结果。

在try / excepts中包装每个尝试都会产生一些难看的意大利面条代码。

c = None

try:
    c = 1 / 0
except:
    pass

if (c == None):
    try:
        c = 1 / (1 - 1)
    except:
        pass

if (c == None):
    try:
        c = int("i am not an int")
    except:
        pass

... and so on

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我会说,在数组中使用lambda函数:

L = [ lambda : 1 / 0, 
      lambda : 1 / (1 - 1), 
      lambda : int("i am not an int"), 
      lambda : 2 ]

for l in L:
  try:
    x = l()
    break
  except:
    pass
print x

在您当前的示例/请求中,您不需要/使用输入数据进行测试,但最终您将在以后使用lambdas非常容易。

答案 1 :(得分:1)

如何简单地使它成为一个功能?我正在使用你的伪代码,所以没有更好的功能,只是更具可读性;

def doIt():

    try:
        return 1 / 0
    except:
        pass

    try:
        return 1 / (1 - 1)
    except:
        pass

    try:
        return int("i am not an int")
    except:
        pass

c = doIt()