重新提出例外不会与#34;最终"条款

时间:2017-05-07 11:15:18

标签: python exception

当我输入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块处理异常,然后将其抬起。

如果没有发生异常,则返回值。

感谢所有答案!这么快:)

2 个答案:

答案 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