最后,在python中try子句的break、continue、return语句之前阻塞execute

2024-06-16 15:27:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

print(bool_return())

输出为:

foo ola

为什么?


Tags: 代码executereturnfoodefpass语句bool
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将继续执行它在脚本之前所做的操作或结束脚本

如果Python会立即返回,那么函数就到此结束。无论发生什么情况,finally块都被认为是运行的,因此它必须首先运行,即使原始返回丢失

相关问题 更多 >