sky*_*bbi 59 python try-catch try-finally try-except
下面有一些有趣的代码:
def func1():
try:
return 1
finally:
return 2
def func2():
try:
raise ValueError()
except:
return 1
finally:
return 3
func1()
func2()
Run Code Online (Sandbox Code Playgroud)
可以请有人解释,结果将返回这两个函数并解释原因,即描述执行的顺序
lej*_*lot 106
从Python 文档
在离开try语句之前总是执行finally子句,无论是否发生了异常.当try子句中发生异常且尚未由except子句处理(或者它发生在except或else子句中)时,在finally子句执行后重新引发它.当通过break,continue或return语句留下try语句的任何其他子句时,finally子句也在"在出路上"执行.一个更复杂的例子(在同一个try语句中有except和finally子句,与Python 2.5一样):
因此,一旦使用return将try/except块保留,将返回值设置为给定 - 最后块将始终执行,并且应该用于释放资源等,同时在那里使用另一个返回 - 覆盖原始块.
在您的特定情况下,func1()返回2并func2()返回3,因为这些是finally块中返回的值.
140*_*ser 29
它将始终进入finally块,因此它将忽略return在try和except.如果你有一个return高于try和except,它将返回该值.
def func1():
try:
return 1 # ignoring the return
finally:
return 2 # returns this return
def func2():
try:
raise ValueError()
except:
# is going to this exception block, but ignores the return because it needs to go to the finally
return 1
finally:
return 3
def func3():
return 0 # finds a return here, before the try except and finally block, so it will use this return
try:
raise ValueError()
except:
return 1
finally:
return 3
func1() # returns 2
func2() # returns 3
func3() # returns 0
Run Code Online (Sandbox Code Playgroud)
把print报表事先真的,确实有帮助:
def func1():
try:
print 'try statement in func1. after this return 1'
return 1
finally:
print 'after the try statement in func1, return 2'
return 2
def func2():
try:
print 'raise a value error'
raise ValueError()
except:
print 'an error has been raised! return 1!'
return 1
finally:
print 'okay after all that let\'s return 3'
return 3
print func1()
print func2()
Run Code Online (Sandbox Code Playgroud)
返回:
try statement in func1. after this return 1
after the try statement in func1, return 2
2
raise a value error
an error has been raised! return 1!
okay after all that let's return 3
3
Run Code Online (Sandbox Code Playgroud)
您会注意到python总是返回要返回的最后一件事,无论return 1两个函数中的代码"到达" .
一个finally块总是运行,所以函数中返回的最后一件事是finally块中返回的内容.在func1,那是2.在func2,那是3.
| 归档时间: |
|
| 查看次数: |
51561 次 |
| 最近记录: |