在使用"finally"子句时,重新引发异常无效。

5

当我加入finally从句时,except中的raise语句无法工作。

因此,except块不会产生Exception

我错过了什么?如果我想在finally从句返回值后重新引发Exception,我需要做些什么?

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块会处理该异常,然后再次引发它。

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

感谢所有回答!非常迅速 :)


return之后,你不能再做任何事情。 - t.m.adam
2个回答

8
在这里是一个引用了相关文档部分的答案:

这里

try语句块将被执行,其中还包括任何except和else子句。如果在任何子句中发生异常且没有被处理,那么该异常会被暂时保存。接着finally语句块将被执行。如果此时存在保存的异常,那么会在finally语句块结束时重新抛出该异常。如果finally语句块引发了另外一个异常,那么保存的异常会成为新异常的上下文。如果finally语句块执行了return或break语句,那么保存的异常将被丢弃

>>> def f():
...     try:
...         1/0
...     finally:
...         return 42
...
>>> f()
42

附言: 我不太明白你实际想要实现什么; 如zmbq所链接的最佳答案中所述,你无法同时拥有两者。


谢谢您的回答。我明白了,如果没有出现异常,并且在关闭连接等代码之前,我需要返回我的值。 我将编辑帖子并解决这个问题,以帮助其他人。 - Géminis

2

那是因为你在 finally 块中加了一个return语句。这意味着即使抛出异常,你仍然想返回一个值。

更多信息请参见这里


谢谢回答 =)。你们俩都很棒。 - Géminis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接