最后在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语句之前阻止执行的主要内容,如果未能解决你的问题,请参考以下文章
Python3 循环_break和continue语句及循环中的else子句