写脚本时思考到的两个问题,答案思路摘自知乎答主:店小不二
1.如果在 try 语句块里使用 return 语句,那么 finally 语句块还会执行吗?
2.如果执行,那么是怎样实现既执行 return 又执行 finally 的呢?
答1.对于该问题,答案是肯定的。Java官方文档上是这么描述的:
Thefinally
block always executes when thetry
block 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这一行代码