【发布时间】:2018-08-05 08:38:46
【问题描述】:
我希望 myfunction 返回 0 而不是执行 finally,但它为什么这样做呢?
def myfunction(i):
try:
result=10/i
except:
return 0
finally:
return 10
print(myfunction(0))
【问题讨论】:
标签: python python-3.6
我希望 myfunction 返回 0 而不是执行 finally,但它为什么这样做呢?
def myfunction(i):
try:
result=10/i
except:
return 0
finally:
return 10
print(myfunction(0))
【问题讨论】:
标签: python python-3.6
finally 总是被执行,无论是否发生异常。文档在本质上非常清楚:
finally 子句总是在离开 try 语句之前执行,无论是否发生异常。当 try 子句中发生异常并且没有被 except 子句处理(或者它发生在 except 或 else 子句中)时,它会在 finally 子句执行后重新引发。
所以finally 子句中的return 语句会覆盖exception 子句中的语句。将return 语句放在finally 子句中没有多大意义,因为这将是函数返回的唯一值。
【讨论】:
无论在 catch 块中发生什么,finally 部分中的代码都会运行(除非您的程序在到达 finally 部分之前以某种方式终止)如果您希望它不运行,您应该像这样更改您的代码:
def myfunction(i):
try:
result=10/i
except:
return 0
return 10
【讨论】:
它返回10,因为try 块中的finally 子句在任何return 语句之前执行,如this answer 所示。
还值得注意的是,您使用的是通用 except,这将导致很多意外行为。检查this answer 了解如何最好地构造try/except 块和最好的raise 异常。
【讨论】: