通常,一个 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
有一个更好的方法吗?