你不能同时“raise”和“return”,所以你必须在返回值中添加一个特殊的变量(例如:在元组中)以防出错。
例如:我有一个函数(名为“func”),它计算一些东西,即使在计算过程中发生异常,我也需要(部分)结果。在我的示例中,我将使用 KeyboardInterrupt 异常(用户按下 CTRL-C)。
在函数中没有异常处理(这是错误的,如果出现任何异常,函数不会返回任何东西):
def func():
s=0
for i in range(10):
s=s+1
time.sleep(0.1)
return s
x=0
try:
for i in range(10):
s=func()
x=x+s
except KeyboardInterrupt:
print(x)
else:
print(x)
现在我引入一个布尔返回值(在元组中,在原始返回值旁边)来指示是否发生了异常。因为在函数中我只处理 KeyboardInterrupt 异常,我可以确定这已经发生了,所以我可以在调用函数的地方提出同样的问题:
def func():
try:
s=0
for i in range(10):
s=s+1
time.sleep(0.1)
except KeyboardInterrupt: # <- the trick is here
return s, True # <- the trick is here
return s, False # <- the trick is here
x=0
try:
for i in range(10):
s,e=func()
x=x+s
if e: # <- and here
raise KeyboardInterrupt # <- and here
except KeyboardInterrupt:
print(x)
else:
print(x)
注意:我的例子是python3。使用了 time 模块(在上面的两个代码中),但我没有导入它只是为了让它更短。如果您想真正尝试一下,请放在开头:
import time