写脚本时思考到的两个问题,答案思路摘自知乎答主:店小不二

1.如果在 try 语句块里使用 return 语句,那么 finally 语句块还会执行吗?

2.如果执行,那么是怎样实现既执行 return 又执行 finally 的呢?

 

答1.对于该问题,答案是肯定的。Java官方文档上是这么描述的:

The finally block always executes when the try block exits.

我们看到描述词用的是always,即在try执行完成之后,finally是一定会执行的。这种特性可以让程序员避免在try语句中使用了returncontinue或者 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这一行代码