下面是有趣的代码:
def func1():
try:
return 1
finally:
return 2
def func2():
try:
raise ValueError()
except:
return 1
finally:
return 3
func1()
func2()
可以请人解释一下,什么结果将返回这两个函数并解释原因,即描述执行的顺序
从Python文档
无论是否发生异常,finally子句始终在离开try语句之前执行。如果try子句中发生了异常且未由except子句处理(或在except或else子句中发生),则在执行finally子句后重新引发该异常。
当try语句的任何其他子句通过break,continue或return语句留下时 ,finally子句 也将“在输出中”执行
。一个更复杂的示例(在同一try语句中具有except和finally子句从Python 2.5开始有效):
因此,一旦将try / except块保留为 return ,这会将返回值设置为给定值-最终块将 始终
执行,并且应用于释放资源等,而在此使用另一种return会覆盖原始值。
在您的特殊情况下,func1()
return2
和func2()
return 3
,因为这些是在finally块中返回的值。
问题内容: 我们可以在 finally 块中使用return语句吗?这会引起任何问题吗? 问题答案: 从块内部返回会导致丢失。 finally块中的return语句将导致任何在try或catch块中引发的异常都将被丢弃。 根据 Java语言规范: 如果由于任何其他原因R导致try块的执行突然完成,则执行finally块,然后可以选择: 注意:根据 JLS 14.17 ,return语句总是突然完成
问题内容: 考虑到此代码,我是否可以 绝对确定 该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 如果您调用 如果JVM首先崩溃 如果JVM在或块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程执行并
问题内容: 我想在finally块中关闭流,但是它抛出一个,因此看来我必须在块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。 这是代码: 问题答案: 似乎有点笨拙。 它是。至少java7尝试使用资源可以解决该问题。 在java7之前,您可以创建一个吞咽它的函数: 或将try …最终放入try catch中: 它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接
在 中,尝试捕获最终阻止的工作原理是什么? 所以如果有例外,我知道它会跳到捕获块,然后跳到最后的块。 但是如果没有错误,catch块不会运行,但是finally块会运行吗?
问题内容: Eclipse在以下代码中给我该警告: 我的代码有什么问题? 问题答案: 从中删除return语句。最终块被认为是清除块,通常不希望在其中返回。
我声明了一个RESTendpoint,它使用调用另一个路由。在第二条路由的末尾,我记录了正文,但它与返回到浏览器的正文不同。 我知道拆分和过滤器正在工作,因为我在最后一行代码中记录了正文,这就是日志中出现的内容: 2021-04-28 18:15:15.707信息3905542---[nio-8080-exec-1]按ID搜索:{“ID”:“1”,“Tipo”:“PF”,“NOME”:“João