当我输入finally
条款时,raise
中的except
语句无效。
因此except
区块不会产生Exception
。
我错过了什么?如果我想在Exception
子句返回值后重新引发finally
,我该怎么办?
def test():
res = 1
try:
raise Exception
res = 2
except:
print('ha fallado')
raise
finally:
return res
test()
解决方案:
def test():
res = 1
try:
raise Exception
res = 2
except:
print('ha fallado')
raise
finally:
# ... finally code that need to exec
pass
return res
print(test())
这样,如果发生异常,则except块处理异常,然后将其抬起。
如果没有发生异常,则返回值。
感谢所有答案!这么快:)
答案 0 :(得分:3)
Here是一个引用文档相关部分的答案:
执行try子句,包括任何except和else子句。如果任何子句中发生异常但未处理,则会临时保存该异常。 finally子句被执行。如果存在已保存的异常,则会在finally子句的末尾重新引发异常。如果finally子句引发另一个异常,则将保存的异常设置为新异常的上下文。 如果finally子句执行return或break语句,则会丢弃已保存的异常:
>>> def f():
... try:
... 1/0
... finally:
... return 42
...
>>> f()
42
P.S。我不太明白你真正想要达到的目的;正如zmbq链接的最佳答案所述,你不可能真的同时拥有这两者。
答案 1 :(得分:1)
那是因为你在return
块中放了一个finally
语句。这意味着你真的想要返回一个值,即使抛出异常。
有关详细信息,请参阅here。