通常,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
有更好的方法吗?
答案 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()