2

通常,一个 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

有一个更好的方法吗?

4

2 回答 2

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 非常容易。

于 2013-05-26T07:27:29.853 回答
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()
于 2013-05-26T07:05:11.617 回答