假设我有两个(或更多)功能。一个是更高级别,通过调用不同的其他功能处理东西。如果其中一个函数失败(例如数学错误),我不仅要“中止”该函数,还要调用那个函数。在我的情况下,我需要这个来逃避错误,避免完成所有计算的其余部分,而不退出整个过程(这也将终止我的GUI)。相反,我希望脚本继续运行,但回到最高级别。
这是我原来问题的抽象:
def levelA(x):
xx = levelB(x=x)
xx *= 2
return xx
def levelB(x):
if x==0: return
y = 10 / x
return y
x = 0
print (levelA(x=x))
使用值0初始化x
会导致levelB
在10除以x
时崩溃。所以我首先确保x
与0不同。如果不是,则通过调用return来中止该函数。现在levelA
希望继续将levelB
的结果加倍,在x=0
的情况下,这是“无”,然后我们再次崩溃。
当然,我能做的就是插入行
if xx is None: return
在做xx *= 2
之前。但在我的实际情况中,不仅有一个额外的级别,而是2或甚至3,并且有许多不同的函数被调用。我想避免检查函数的每个输出是否有错误。
所以我的问题是:我可以以某种方式回到第一个函数调用并跳过介于两者之间的函数吗?像“深度回报”之类的东西?
答案 0 :(得分:3)
try / catch怎么样?
def levelA(x):
xx = levelB(x=x)
xx *= 2
return xx
def levelB(x):
if x==0: raise ZeroDivisionError
y = 10 / x
return y
try:
x = 0
print (levelA(x=x))
except ZeroDivisionError:
// error handling or other stuff
答案 1 :(得分:3)
发明了例外来处理你描述的情况。所以,例如:
In [72]: def f1(x):
...: return f2(x)
...:
In [73]: def f2(x):
...: return f3(x)
...:
In [74]: def f3(x):
...: if x > 0:
...: return x
...: else:
...: raise ValueError("f3 called with negative argument")
...:
In [75]: try:
...: print(f1(-2))
...: except ValueError as e:
...: print(e)
...:
f3 called with negative argument
答案 2 :(得分:1)
使用值0初始化x会在10除以x时导致levelB崩溃。所以我首先确保x与0不同。如果不是,则通过调用return来中止该函数。
这是一个很好的总结,但你得出了错误的结论。你不应该return
,你应该提出Exception
。然后,您可以在任何地方使用try
,except
子句:
def levelA(x):
xx = levelB(x=x)
xx *= 2
return xx
def levelB(x):
if x==0: raise ValueError
y = 10 / x
return y
x = 0
try:
print(levelA(x=x))
except ValueError:
print('x was invalid! Wanna try again?')
更好的做法就是进行划分并抓住那里提出的例外情况:
def levelA(x):
xx = levelB(x=x)
xx *= 2
return xx
def levelB(x):
y = 10 / x
return y
x = 0
try:
print(levelA(x=x))
except ZeroDivisionError:
print('x was invalid! Wanna try again?')