为什么函数不引发异常?它显然没有被抓住。
def f():
try:
raise Exception
finally:
return "ok"
print(f()) # ok
答案 0 :(得分:7)
the documentation中明确说明了这一点:
如果任何子句中发生异常但未处理,则会暂时保存该异常。执行
finally
子句。 [..]如果finally
子句执行return
或break
语句,将丢弃已保存的异常
答案 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)
在离开 try语句之前,finally子句始终执行 ,无论是否发生了异常。 [...]当通过break,continue或 return语句保留try语句的任何其他子句时,finally子句也在“出路”时执行。
这意味着,在函数中,finally子句将始终是返回的子句。即使发生无异常:
def f():
try:
return 'OK'
finally:
return 'Finally'
f() # returns 'Finally'
答案 3 :(得分:2)
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
子句处理(或者在try
或except
子句中发生)时, -except
子句执行后.-
在您的情况下,该异常尚未处理,因此应在else
子句之后重新引发,但由于您从finally
子句返回,因此异常永远不会重新引发。