finally 块在 break,continue,return 语句之前执行 python 中的 try 子句

finally block execute before the break,continue,return statement of try clause in python

finally block execute before break or continue or return statement of try clause in python 那为什么这段代码的输出是不同的

def bool_return():
    try:
        return print("foo")
    except:
        pass
    finally:
        return "ola"

print(bool_return())

输出为:

foo ola

为什么?

返回某些东西是函数可以做的最后一件事。 return执行某些操作后,Python 将继续执行之前的操作或结束脚本。

如果Python会立即return,这就是函数的结束。 finally 块被认为是 运行 无论发生什么,因此它必须先 运行,即使原来的 return 丢失了。

finally 块是我们编写关闭与其他服务器连接的代码的地方。如果万一我们 return 从声明中编辑,我们将打开连接,以便在退出功能之前执行它。 我们可以检查我们是否在 final 块中写入 return 并尝试执行哪个块

您的代码

def bool_return():
    try:
        return print("foo")
    except:
        pass
    finally:
        return print("ola")

print(bool_return())

正在使用 finally 子句。 finally 子句在退出所属 try/except 块之前执行。这意味着您的 could 已变成以下内容(伪代码!):

function bool_return():
    do in case of errors goto Errors:
        var r = print("foo") < this is the statement in the try block
        print("ola") < this is the statement in the finally one
        return r
Errors:
        do nothing < this is the pass instruction.
        var r = print ("ola")
        return r 

print(bool_return())

暂时忽略可能不正确的 return 语句,你的问题的罪魁祸首是解释器如何 运行 语句:

 return print("foo")

一分为二

var r = print("foo") < this is the statement in the try block
return r

然后在return

之前执行finally的内容
var r = print("foo") < this is the statement in the try block
print ("ola")
return r

这是因为try块的语义如下

  • 运行 try 块中包含的任何内容。如果 运行 没有错误,存储 return 值(如果存在),然后 运行 finally 块的内容。如果这里没有错误发生并且我们有一个 return 值,那么 return 存储了 return 值
  • 如果 try 块有错误,那么 运行 except 块中的内容(如果存在)。如果此处没有错误,则存储 return 值(如果存在)、运行 和 finalize 块,如果此处没有错误,则 return 存储 return 值
  • 如果 except 块为错误,则停止执行并且 finally 块为 运行。然后将异常传播到外部块。
  • 现在事情会变得一团糟,因为您可以(并且将会)嵌套多个 try 块。上述步骤递归重复,直到处理异常或到达解释器 try 块。在后一种情况下,应用程序将停止,异常将使用通常的 traceback 语法打印到控制台。

这只是为了让您了解它的工作原理。某些细节可能会遗漏或可能不是 100% 正确。如果您想了解更多信息,可以在 W3C and learn more here.

玩例外