为什么不`finally:return`传播未处理的异常?

时间:2016-06-29 08:58:29

标签: python python-3.x exception-handling

为什么函数不引发异常?它显然没有被抓住。

def f():
    try:
        raise Exception
    finally:
        return "ok"

print(f())  # ok

4 个答案:

答案 0 :(得分:7)

the documentation中明确说明了这一点:

  

如果任何子句中发生异常但未处理,则会暂时保存该异常。执行finally子句。 [..]如果finally子句执行returnbreak语句,将丢弃已保存的异常

答案 1 :(得分:4)

来自docs

  

在离开try语句之前,finally子句始终执行。

@deceze在他的answer

中引用了更相关的部分

该函数返回finally子句中的字符串,并且在返回后不会引发异常,并且会打印出来的内容。

如果您尝试执行:

>>> try:
...     raise Exception
... finally:
...     print('yes')
... 
yes
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
Exception

然后如你所见,&#34;是&#34;打印并在打印语句后抛出异常。

答案 2 :(得分:3)

来自documentation

  

在离开 try语句之前,finally子句始终执行 ,无论是否发生了异常。 [...]当通过break,continue或 return语句保留try语句的任何其他子句时,finally子句也在“出路”时执行。

这意味着,在函数中,finally子句将始终是返回的子句。即使发生无异常

def f():
    try:
        return 'OK'
    finally:
        return 'Finally'

f() # returns 'Finally'

答案 3 :(得分:2)

documentation说:

  

finally子句总是在离开subprocess语句之前执行,无论是否发生了异常。当PORT = 8813 sumoBinary = 'C:/Program Files (x86)/DLR/Sumo/bin/sumo-gui' sumoProcess = subprocess.Popen([sumoBinary, "-c", "Kaiserslautern.sumocfg", \ "--remote-port", str(PORT)]) 子句中发生异常且尚未由try子句处理(或者在tryexcept子句中发生)时, - except子句执行后.-

在您的情况下,该异常尚未处理,因此应在else子句之后重新引发,但由于您从finally子句返回,因此异常永远不会重新引发。