最后在python中try子句的break,continue,return语句之前阻止执行

Posted

技术标签:

【中文标题】最后在python中try子句的break,continue,return语句之前阻止执行【英文标题】:finally block execute before the break,continue,return statement of try clause in python 【发布时间】:2020-03-18 11:33:14 【问题描述】:

在python中try子句的break或continue或return语句之前最终阻塞执行,那么为什么这段代码的输出不同

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

print(bool_return())

输出是:

foo ola

为什么?

【问题讨论】:

代码完全按照文档中的说明进行操作。 finally 块在 return 之前执行。所以它打印 98 而不是打印 99 然后返回 ok 的 finally 块。 更多信息请通过python doc 【参考方案1】:

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

如果 Python 会立即返回,这将是函数的结尾。 finally 块被认为不管发生什么都会运行,因此它必须首先运行,即使原始返回丢失。

【讨论】:

【参考方案2】:

finally 块是我们编写关闭与其他服务器连接的代码的地方。如果我们从语句中返回,我们将打开连接,因此它将在退出功能之前执行。 我们可以检查我们是否在 final 块中写了一个 return 并 try 块正在执行哪个

【讨论】:

【参考方案3】:

你的代码

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

print(bool_return())

正在使用finally 子句。 finally 子句在退出拥有的 try/except 块之前执行。这意味着您可以将其转换为以下内容(伪代码!):

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

然后在返回之前执行finally的内容

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

这是因为try块的语义如下

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

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

【讨论】:

以上是关于最后在python中try子句的break,continue,return语句之前阻止执行的主要内容,如果未能解决你的问题,请参考以下文章

第18章 finally子句

Python3 循环_break和continue语句及循环中的else子句

为啥在 try/except 块中使用 Python 的“else”子句? [复制]

Python try-else

Python入门指南4,错误与异常

Python的异常处理