用try :?捕获异常时为什么不能返回?

时间:2015-03-12 12:20:29

标签: python

我希望在捕获异常时在某些条件下从函数返回:

def myfunc():
    try:
        a = 1
    except:
        pass
    else:
        if a == 1:
            return a
    finally:
        return 100

x = myfunc()
print(x)

我对上述代码的期望是

  • try成功(没有例外)
  • 转到符合条件的else
  • 从函数返回a,其余代码未运行

你可以想象,我得到的结果是100,这意味着评估了finally条款。

由于我显然遗漏了一些东西,我通过调试器运行了这个,但我确实到达return a行,但实际上并没有返回。

2 个答案:

答案 0 :(得分:6)

finally 始终已执行。你回来很好,只是你误解了finally套件做什么

来自try statement documentation

  

return语句的break套件中执行continuetrytry...finally语句时,finally子句为也在'出路'上执行。

在此上下文中,exceptelse处理程序仍然是try套件的一部分。

finally套件是一个清理处理程序;一旦你进入try套件,无论发生什么,都保证finally被执行。这也意味着您可以更改返回的内容。这是明确记录的:

  

函数的返回值由最后return确定   声明已执行。由于finally子句始终执行,因此return   在finally子句中执行的语句将始终是最后一个   执行:

>>>
>>> def foo():
...     try:
...         return 'try'
...     finally:
...         return 'finally'
...
>>> foo()
'finally'

答案 1 :(得分:1)

finally语句总是按照try语句文档执行。对于您的功能,您可能希望使用“else if”

def myfunc():
 try:
    a = 1
except:
    pass
elif: a == 1:
        return a
else:
        return 100

x = myfunc()
print(x)