写脚本时思考到的两个问题,答案思路摘自知乎答主:店小不二
1.如果在 try 语句块里使用 return 语句,那么 finally 语句块还会执行吗?
2.如果执行,那么是怎样实现既执行 return 又执行 finally 的呢?
答1.对于该问题,答案是肯定的。Java官方文档上是这么描述的:
Thefinallyblock always executes when thetryblock exits.
我们看到描述词用的是always,即在try执行完成之后,finally是一定会执行的。这种特性可以让程序员避免在try语句中使用了return, continue或者 break关键字而忽略了关闭相关资源的操作。把清理相关资源放到finally语句块中一直是最佳实践。
2.我们知道了finally语句会执行,那么try{return} finally的类似写法会如何处理呢?
假设有代码块
def method():
x = 1
try:
++x
return x
finally:
++x
return x
此时,调用method,返回的答案会是2,python try-final的机制会让方法记住try里面return的值(即把try里的return存到一个本地变量中去),接下来执行finally语句,最后返回的会是本地变量保存的值;
但请注意如下写法
def method():
x = 1
try:
++x
return x
finally:
++x
return x
return x
此时,调用method,返回的答案会是3,当try和finally中同时存在return时,python会忽略掉try中的return,即等效于try中没有return x这一行代码
浙公网安备 33010602011771号